微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我遇到了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是不可为空的值类型,那么表达式(因此是神秘的)将是类型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;
}

但没有任何限制,没有有效的翻译.

原文地址:https://www.jb51.cc/csharp/97444.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐