Для примера: следующее не компилируется
Код: Выделить всё
public static T Test(Func func)
{
return func?.Invoke() ?? default(T);
}
Однако я знаю, что вы можете добиться того же самого:
Код: Выделить всё
public static T Test(Func func)
{
return func != null ? func() : default(T);
}
Чтобы уточнить дальнейшее действие, однако работает так, как ожидалось.
Код: Выделить всё
public static void Test(Action action, T arg)
{
action?.Invoke(arg);
}
После некоторых дополнительных исследований это становится еще менее разумным, даже если учесть следующее:
Предположим, у нас есть класс (ссылочный тип)
Код: Выделить всё
public class Foo
{
public int Bar { get; set; }
}
Код: Выделить всё
Func fun = () => 10;
Код: Выделить всё
// This work
var nullableBar = foo?.Bar; // type of nullableBar is int?
var bar = nullableBar ?? default(int); // type of bar is int
// And this work
nullableBar = fun?.Invoke(); // ditto
bar = nullableBar ?? default(int); // ditto
Однако, как только левый универсальный тип нулевого условного оператора станет универсальным без ограничений, он не сможет применить ту же логику, которую он должен иметь возможность учитывать, он может применить одна и та же логика для обоих типов значений и ссылочных типов, когда типы применяются явно.
Я знаю об ограничениях компилятора, для меня просто не имеет смысла, почему он этого не позволяет и почему он хочет, чтобы выходные данные были разными, будь то ссылочный или значащий тип, учитывая, что применение типов вручную даст ожидаемые результаты.