【发布时间】:2015-12-11 09:12:21
【问题描述】:
试图使Feature泛型然后突然编译器说
运算符'?'不能应用于“T”类型的操作数
这里是代码
public abstract class Feature<T>
{
public T Value
{
get { return GetValue?.Invoke(); } // here is error
set { SetValue?.Invoke(value); }
}
public Func<T> GetValue { get; set; }
public Action<T> SetValue { get; set; }
}
可以改用这段代码
get
{
if (GetValue != null)
return GetValue();
return default(T);
}
但我想知道如何修复那个漂亮的 C# 6.0 单线。
【问题讨论】:
-
这真的很有趣。我认为这可能是一个错误。正如您的第二个代码块所示,所有建议使用
where T : class的答案都缺少您正在检查Func<T>是否为空而不是T的事实。如果这样可行,那么GetValue?.Invoke()语法也应该可以使用。你应该可以写:return GetValue?.Invoke() ?? default(T) -
@kjbartel:我认为这是由于
?.返回null,如果表达式是null,而不是default(T)。 -
Func
可以为空。 -
我认为,问题是编译器无法确定
GetValue?.Invoke()的结果类型。如果T为class或Nullable<>,则结果类型应为T,但如果T为struct,则结果类型应为T?。 -
@kjbartel
List?.Count的结果类型是int?。在编译时就知道,该类型应该提升为可为空的。GetValue?.Invoke()的结果类型为T或T?。在编译时不知道,应该将类型提升为可为空的,还是已经可以为空。
标签: c# generics delegates c#-6.0 null-propagation-operator