csharp 10
От: vaa  
Дата: 09.11.21 02:33
Оценка:
мне одному кажется странным, что компилятор для локальной лямбды из контекста не может вывести тип аргумента?
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"
☭ ✊ В мире нет ничего, кроме движущейся материи.
Отредактировано 09.11.2021 2:45 Разраб . Предыдущая версия . Еще …
Отредактировано 09.11.2021 2:34 Разраб . Предыдущая версия .
Re: csharp 10
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.11.21 10:20
Оценка: 7 (1)
Здравствуйте, 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"
};
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: csharp 10
От: Jack128  
Дата: 09.11.21 10:36
Оценка: +1 :)
Здравствуйте, 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";

?
Re: csharp 10
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.11.21 01:25
Оценка: 12 (1)
Здравствуйте, 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 }
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: csharp 10
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.11.21 01:31
Оценка:
Здравствуйте, 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'
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: csharp 10
От: Jack128  
Дата: 12.11.21 11:09
Оценка: 40 (1)
Здравствуйте, 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: что то фидл упал, вот ссылка шарплаб
Отредактировано 12.11.2021 11:13 Jack128 . Предыдущая версия .
Re[3]: csharp 10
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.11.21 02:11
Оценка: +1
Здравствуйте, 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<...>. Остается только вопрос когда они додумаются до простой мысли — делегаты не нужны?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.