使用 NRT 注释时类型参数为结构体时泛型类型的 C# 语言规范

问题描述 投票:0回答:2

在此代码中,

new Of<int>().Value
的类型是
int
,而不是
int?
,即使
Value
的字段声明具有
?

C# 规范是否澄清在这种情况下,

T?
的类型将是(不可为空)值类型,而不是可空值类型?我找不到它。

#nullable enable

void Main()
{
    Console.WriteLine( new Of<int>().Value.GetType() );
}

class Of<T>
{
    public T? Value;

    public Of(T? value) => Value = value;
    public Of() {}

    public Of<T> Create() => new Of<T>(default);
    
}
c# nullable-reference-types
2个回答
0
投票

您的声明过于开放,因为可为空值类型与引用类型有很大不同。如果您要澄清您感兴趣的路径,生成的代码将符合您的期望:

class Of<T> where T: struct
{
    T? value; // ie, Nullable<T>
}

0
投票

许多新功能的 C# 规范尚未正确更新。这些有单独的附录。

关于 NRT 的无约束类型参数在功能规范中

在 C#9 中,?注释可以应用于任何类型参数,无论约束如何。

除非类型参数明确限制为值类型,否则注释只能在 #nullable 启用上下文中应用。

如果类型参数 T 被替换为引用类型,那么 T?表示该引用类型的可为空实例。

var s1 = new string[0].FirstOrDefault();  // string? s1
var s2 = new string?[0].FirstOrDefault(); // string? s2

如果将T替换为值类型,那么T呢?代表 T 的一个实例。

var i1 = new int[0].FirstOrDefault();  // int i1
var i2 = new int?[0].FirstOrDefault(); // int? i2

如果 T 被替换为带注释的类型 U?,则 T?代表注释类型 U?而不是U??.

var u1 = new U[0].FirstOrDefault();  // U? u1
var u2 = new U?[0].FirstOrDefault(); // U? u2

如果T被类型U替代,那么T呢?代表 U?,即使在 #nullable 禁用上下文中也是如此。

#nullable disable
var u3 = new U[0].FirstOrDefault();  // U? u3
© www.soinside.com 2019 - 2024. All rights reserved.