这是编译器错误还是有特定选择的原因导致空条件运算符不适Func
用于泛型方法内部?
举个例子,以下内容无法编译
public static T Test<T>(Func<T> func)
{
return func?.Invoke() ?? default(T);
}
编译器产生的错误是CS0023 Operator '?' cannot be applied to operand of type 'T'
我知道你可以做到这一点,但是:
public static T Test<T>(Func<T> func)
{
return func != null ? func() : default(T);
}
那么为什么不允许呢?
然而,进一步详细说明Action<T>
按预期工作。
public static void Test<T>(Action<T> action, T arg)
{
action?.Invoke(arg);
}
更新(2017-01-17):
经过一些更多的研究,它变得更没有意义了,即使有以下几点:
假设我们有一个类(引用类型)
public class Foo
{
public int Bar { get; set; }
}
假设我们有一个Func<int>
Func<int> 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
这意味着根据那里应用的逻辑,使用and运算符Func<T>
的值类型应该可以工作。null-conditional
null-coalescing
但是,一旦左侧的泛型类型null-conditional
是没有约束的泛型,那么它就不能应用它应该能够考虑的相同逻辑,当类型时,它可以将相同的逻辑应用于值类型和引用类型被明确应用。
我知道编译器的限制,这对我来说没有意义,为什么它不允许它以及为什么它希望输出不同,无论它是参考类型还是值类型,考虑到手动应用类型会产生预期的结果.