gpt4 book ai didi

c# - 运算符 '?' 不能应用于类型 'T' 的操作数 (2)

转载 作者:可可西里 更新时间:2023-11-01 08:19:02 26 4
gpt4 key购买 nike

我遇到了 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;
}

最佳答案

我认为问题在于编译器无法知道表达式 _valueProvider?.Value 的类型.

让我们稍微简化一下:

public interface IValueProvider<T>
{
T Value { get; }
}

public class Test
{
public static void Foo<T>(IValueProvider<T> provider)
{
var mystery = provider?.Value;
}
}

编译器应该推断出 mystery 的类型是什么?是吗?

  • 如果 T是引用类型或可空值类型,则表达式(因此 mystery )的类型是 T 才有意义.

  • 如果 T是一个 不可空 值类型,表达式(因此 mystery )的类型是 T? 是有意义的.

因为 T 没有限制,没有合适的类型可供使用,因此出现(有点不幸)错误消息。

如果属性的类型是 string , intint? ,所有这些都可以,并且表达式的类型为 string , int?int?分别。但是对于 T 没有对应的.

如果你约束T做个引用类型就好了,表达式的类型是T :

public static void Foo<T>(IValueProvider<T> provider) where T : class
{
// Variable is of type T
var mystery = provider?.Value;
}

如果你约束T成为一个不可为 null 的值类型就可以了,表达式的类型是 T? (又名 Nullable<T>)。

public static void Foo<T>(IValueProvider<T> provider) where T : struct
{
// Variable is of type Nullable<T>
var mystery = provider?.Value;
}

但是没有任何一个约束,就没有有效的翻译。

关于c# - 运算符 '?' 不能应用于类型 'T' 的操作数 (2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44174712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com