猫王经营者?奇怪的是在明显的情况下不编译

时间:2016-07-15 17:18:16

标签: c# visual-studio-2015 roslyn c#-6.0

这个静态方法编译:

javascript

为什么不呢?然而,这个不是:

public static void Foo<TValue>(Func<TValue> factory = null)
{
    factory?.Invoke();
}

使用返回值似乎有所不同:

enter image description here

当然,运算符public static void Foo<TValue>(Func<TValue> factory = null) { var x = factory?.Invoke(); } 不应用于?.类型的操作数,而是应用于TValue类型的操作数,这就是为什么它在不使用表达式值时的作用

非通用案例运作得很好:

Func<TValue>

2 个答案:

答案 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类型,那么应该是吗?