мне одному кажется странным, что компилятор для локальной лямбды из контекста не может вывести тип аргумента?
var parse = (string s) => int.Parse(s);
var parse = s => int.Parse(s); // ERROR: Not enough type info in the lambda
welcome-to-csharp-10
И всё-таки:
var choose = object (bool b) => b ? 1 : "two"; // Func<bool, object>
гораздо менее читаемо, чем:
let choose : bool -> obj =
function | true -> 1 | _ -> "two"
Здравствуйте, 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"
};
Здравствуйте, vaa, Вы писали:
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>
Хм. ИМХО нет, первый вариант гораздо органичнее смотрится. let/function, какие то вертикальные палки. Такого в C# нигде нет.
Но в целом — вообще фича непонятная.
чем
var choose = object (bool b) => b ? 1 : "two";
лучше существующего
Func<bool, object> choose = b => b ? 1 : "two";
?
Здравствуйте, 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>
Не одному. Но это базовый баг в самом фрэймворке. Вместо введения функционального типа в нем ввели делегаты. Шарп использует делегаты и как следствие появляется неоднозначность (не ясно к какому типу делегата приводить функцию). F# и Nemerle используют собственную концепцию типов функций, так что таких проблем не имеют.
vaa>гораздо менее читаемо, чем:
vaa>vaa>let choose : bool -> obj =
vaa> function | true -> 1 | _ -> "two"
vaa>
Ну, в Nemerle по мне так по лучше:
def choose(value) : object { | true => 1 | false => "two" }
А если багодромного автоматического приведения к object не нужно, то можно вообще без указания типов обойтись:
def choose(value) { | true => 1 | false => 2 }
Здравствуйте, Jack128, Вы писали:
J>чем
J>J>var choose = object (bool b) => b ? 1 : "two";
J>
J>лучше существующего
J>J>Func<bool, object> choose = b => b ? 1 : "two";
J>
J>?
"Существующий" выдаёт Compilation error: Type of conditional expression cannot be determined because there is no implicit conversion between 'int' and 'string'
Здравствуйте, Sinclair, Вы писали:
S>"Существующий" выдаёт Compilation error: Type of conditional expression cannot be determined because there is no implicit conversion between 'int' and 'string'
https://dotnetfiddle.net/6JlwYH
update: что то фидл упал, вот ссылка
шарплаб
Здравствуйте, Sinclair, Вы писали:
S>"Существующий" выдаёт Compilation error: Type of conditional expression cannot be determined because there is no implicit conversion between 'int' and 'string'
Ты чем комплишь то? Это в C# 9 пявилось. Похоже побочный эффект от
functional pointers. В МС таки додумались, что в случае неоднозначности можно выбирать делегат Func<...>. Остается только вопрос когда они додумаются до простой мысли — делегаты не нужны?