Здравствуйте, vaa, Вы писали:
vaa>мне одному кажется странным, что компилятор для локальной лямбды из контекста не может вывести тип аргумента?
vaa>vaa>var parse = (string s) => int.Parse(s);
vaa>var parse = s => int.Parse(s); // ERROR: Not enough type info in the lambda
vaa>
Немного странновато. Такой же фейл происходит и, к примеру, вот тут:
private void Test<T1, T2>(Func<T1, T2> func){};
public void Test()
{
Test(s=>int.Parse(s);
}
А вот в таком случае он ухитряется верно выбрать перегрузку:
private void Test<T>(Func<string, T> func) {Console.WriteLine("string");}
private void Test<T>(Func<int, T> func) {Console.WriteLine("int");}
public void Test()
{
Test(s=>int.Parse(s));
Test(s=>s+1);
}
vaa>welcome-to-csharp-10
vaa>И всё-таки:
vaa>vaa>var choose = object (bool b) => b ? 1 : "two"; // Func<bool, object>
vaa>
vaa>гораздо менее читаемо, чем:
vaa>vaa>let choose : bool -> obj =
vaa> function | true -> 1 | _ -> "two"
vaa>
Ну, как раз когда тип функции известен и вы готовы его записать, всё работает как надо:
Func<bool, object> choose = (b) => b ? 1 : "two";
или даже
Func<bool, object> choose = b => b switch {
true => 1,
_ => "two"
};