using System; static class Maybe { public static Maybe C (T value) { return null; } } sealed class Maybe { public Maybe (T value) { } } static class Extensions { public static R Match(this T self, params Func>[] matchers) { return default (R); } } class Test { public static void Main () { Extensions.Match ("a", s => Maybe.C(s)); Extensions.Match ("a", s => Maybe.C(s), s => Maybe.C("a")); } }