【发布时间】:2017-05-25 07:26:13
【问题描述】:
我遇到了 C# 编译器 (VS 2015) 的奇怪行为。 在下面的代码中,编译器对 Value2 很满意,但抱怨 Value1: Operator '?'不能应用于“T”类型的操作数
为什么?
public interface IValueProvider<T>
{
T Value { get; }
}
class Validator<T>
{
public Validator(IValueProvider<T> provider)
{
_valueProvider = provider;
}
public T Value1 => _valueProvider?.Value ?? default(T);
public T Value2 => _valueProvider != null ? _valueProvider.Value : default(T);
private readonly IValueProvider<T> _valueProvider;
}
【问题讨论】:
-
这并不奇怪。
?对于不可为空的类型(即结构)没有任何意义。如果没有类型约束,编译器不知道 T 是否是结构。Value2不会在任何地方使用此运算符,这就是它起作用的原因。 -
@PanagiotisKanavos:但是
_valueProvider不是T类型,而是IValueProvider<T>类型。 -
@CodeCaster 相反,非常清楚,sn-p 重现了问题。只需在 LinqPad 中尝试一下,您就会立即解决问题。
-
@CodeCaster 这段代码足以让其他人重现和理解错误。答案应该清楚地表明编译器错误与 Value 有关,因为每个人都认为错误与提供程序有关
-
@CodeCaster:说实话,比实际需要的多一点,但不是很多。这是一个绝对最小的例子吗?不。它是否足够接近以避免大量完全不相关的代码?绝对地。它是否完整,可以很容易地重现问题?是的。
标签: c#