using System.Collections.Generic;
public string P {get; set; }
public override string ToString()
public static string Fail<T>(T v, Func<T,string> transform) {
public static string Fail2<T>(Func<T,string> transform) {
return transform(default(T));
public static string Fine<T>(T v) {
public static A Helper(A aaa)
private static void AssertEquals(object exp, object fact) {
throw new Exception("AssertEquals failed");
public static void Main() {
AssertEquals("123456", B.Fail(new A {P = "123"}, x => x.P+"456"));
AssertEquals("678", B.Fail2((A x) => x+"678"));
AssertEquals("123456", B.Fail<A>(new A {P = "123"}, x => x.P+"456"));
AssertEquals("678", B.Fail2<A>((A x) => x+"678"));
AssertEquals("13", B.Fine(new A {P = "13"}));
var lst = new List<A> {new A {P = "22"} };
var lstFail = lst.Select(z => {
AssertEquals(1, lstFail.Count);
AssertEquals("22", lstFail[0].P);
var lstWorkaround = lst.Select<A,A>(z => {
AssertEquals(1, lstWorkaround.Count);
AssertEquals("22", lstFail[0].P);
Console.WriteLine("done");