在此代码中,
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);
}
您的声明过于开放,因为可为空值类型与引用类型有很大不同。如果您要澄清您感兴趣的路径,生成的代码将符合您的期望:
class Of<T> where T: struct
{
T? value; // ie, Nullable<T>
}
许多新功能的 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