C#8中未知的可空性是什么?

C#8中未知的可空性是什么?,c#,c#-8.0,nullable-reference-types,C#,C# 8.0,Nullable Reference Types,在C#8.0中,我们可以使用可为空的引用类型。声明有4种类型的可空性。前三个很清楚,但我不理解“未知”的意义。文档中说它与泛型一起使用,但当我试图在泛型中对T类型的无约束变量调用一个方法时,它只是发出警告,好像该类型可以为null一样。我看不出未知和可空之间的区别。为什么未知存在?它是如何表现出来的?采用以下通用方法: public static T Get<T>(T value) { return value; } 在这里,编译器不知道最终是否会使用可为null或不可为n

在C#8.0中,我们可以使用可为空的引用类型。声明有4种类型的可空性。前三个很清楚,但我不理解“未知”的意义。文档中说它与泛型一起使用,但当我试图在泛型中对T类型的无约束变量调用一个方法时,它只是发出警告,好像该类型可以为null一样。我看不出未知和可空之间的区别。为什么未知存在?它是如何表现出来的?

采用以下通用方法:

public static T Get<T>(T value)
{
    return value;
}
在这里,编译器不知道最终是否会使用可为null或不可为null的类型调用它

我们可以使用一个新的类型约束来表示
T
不能为null:

public static T Get<T>(T value) where T: notnull
{
    return value;
}

T
不可为空的情况下,我们应该得到一个警告。因此,对于未知的可空性类型,我们需要在取消引用时发出警告,但在执行var result=Test.Get(x)时,也需要为可能的
null

赋值发出警告;result.ToString();编译器抱怨取消引用可能为空的值。我看不出在这种情况下“未知”和“可为空”有什么不同。就警告而言,它们的行为相同,但语义不同。你可以说这种差异是学术性的,如果这是你的观点,那么我同意。我仍然想知道为什么会引入这种差异。为了学术目的在语言中引入这样的区别似乎很奇怪。我的错,只是重新阅读规范,更新答案,最后一部分解释它。啊,更像是这样
public static T Get<T>(T value) where T: notnull
{
    return value;
}
class MyClass<T>
{
    void Method(T x)
    {
        var result = Get<T>(x);
        // reassign result to null, cause we we could if unknown was treated as nullable
        result = null;
    }
}