c# – 运算符?不能应用于’T’类型的操作数(2)
发布时间:2020-12-15 18:04:22 所属栏目:百科 来源:网络整理
导读:我遇到了C#编译器(VS 2015)的奇怪行为. 在代码中,编译器对Value2感到满意,但抱怨Value1:Operator’?’不能应用于“T”类型的操作数 为什么? public interface IValueProviderT{ T Value { get; }}class ValidatorT{ public Validator(IValueProviderT pro
我遇到了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; } } 编译器应该推断出神秘的类型是什么? >如果T是一个引用类型或一个可空值类型,那么这个表达式(因此是一个神秘的)就是T型的. 由于没有对T的约束,所以没有合适的类型被使用,所以有一个(稍微不幸的)错误消息. 如果属性是string,int或int?,那么所有这些都会很好,表达式将是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限制为不可为空的值类型,那么表达式是否为T型? (也称为Nullable T). public static void Foo<T>(IValueProvider<T> provider) where T : struct { // Variable is of type Nullable<T> var mystery = provider?.Value; } 但没有任何限制,没有有效的翻译. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |