using System.Collections.Generic;
public static void Main()
var list = new List<Wrapper<char>>
'A', (Predicate<char>)char.IsDigit
public static implicit operator Wrapper<T>(T value)
return new ValueWrapper<T>(value);
public static implicit operator Wrapper<T>(Predicate<T> predicate)
return new PredicateWrapper<T>(predicate);
public static class WrapperHelper
public static Wrapper<T> Wrap<T>(this T value)
return new ValueWrapper<T>(value);
public static Wrapper<T> Wrap<T>(this Predicate<T> predicate)
return new PredicateWrapper<T>(predicate);
public class ValueWrapper<T> : Wrapper<T>
private readonly T _value;
public ValueWrapper(T value)
public override string ToString()
return _value.ToString();
public class PredicateWrapper<T> : Wrapper<T>
private readonly Predicate<T> _value;
public PredicateWrapper(Predicate<T> value)
public override string ToString()
return _value.Method.ToString();