这个静态方法编译:
javascript
为什么不呢?然而,这个不是:
public static void Foo<TValue>(Func<TValue> factory = null)
{
factory?.Invoke();
}
使用返回值似乎有所不同:
当然,运算符public static void Foo<TValue>(Func<TValue> factory = null)
{
var x = factory?.Invoke();
}
不应用于?.
类型的操作数,而是应用于TValue
类型的操作数,这就是为什么它在不使用表达式值时的作用
非通用案例运作得很好:
Func<TValue>
答案 0 :(得分:6)
尝试添加where TValue: class
以确保TValue
可以null
:
static void Foo<TValue>(Func<TValue> factory = null) where TValue: class
在这种情况下,编译器可以将x
的类型推断为TValue
并在需要时为其分配null
(例如,在factory == null
}的情况下。
或尝试
static void Foo<TValue>(Func<TValue> factory = null) where TValue: struct
在这种情况下,推断的类型将是TValue?
。 (信用证转到 @hvd 。)
答案 1 :(得分:6)
只需考虑factory?.Invoke();
应该解决的类型。 (如果你在这里没有使用var
,你需要做的练习。)它应该是什么类型的?
确定需要考虑如何计算值的类型。如果委托不为null,则需要调用它并将操作解析为TValue
,这是委托返回的任何内容。但是,如果委托是null
,那么表达式factory?.Invoke();
需要解析为null,因此TValue
需要是可空类型。那么,如果TValue
不是可空的,如果不是,那么该表达式不能是TValue
类型,那么应该是吗?