C# delegates make it really easy to implement the visitor pattern.
Instead of making an abstract class and Visit methods that accept a single argument of that class's type, let your Visit methods accept multiple arguments. So instead of a visitor class with N abstract methods, your Visit methods take N arguments, delegates that correspond to the respective methods.
The following example shows the class Result<T> that would contain the result of a computation. If the result is successful, a value of type T would be returned, inside of a Win<T>. If the result is unsuccessful, a Fail<T> would be returned with a message.
This example doesn't show methods that return values of the type Result<T> or how such a value would be used -- it just demonstrates the mechanics of the delegate-based visitor pattern.
The implementation for Result.ValueOrDefault is much nicer than the reflection-based approach using casts and the 'is' operator.