T?, C# 9 中的可空类型参数

T?, nullable type parameter in C# 9

This program 有两个错误:

using System;

T? f<T>(T? t)
{    
    t = null; //  Error CS0403  Cannot convert null to type parameter 'T' because it could be a non-nullable value type
    return default(T?);
}

if(f(10) is null) // Error  CS0037  Cannot convert null to 'int' because it is a non-nullable value type    
    Console.WriteLine("null");

T? 必须是可空类型。但是好像T?和上面程序中的T是一样的。

T?中是否忽略了?


编辑Both errors disappear 具有 struct 约束:

using System;

T? f<T>(T? t)  where T : struct
{    
    t = null; // error
    return default(T?);
}

if(f<int>(10) is null) // error
    Console.WriteLine("null");

我不明白为什么约束会改变结果。

我不知道第一个错误,但是第二个错误。

f(10) is null 被推断为 int 代替 int? 因为 10int 类型。 应使用 f((int?)10) is nullf<int?>(10) is null

当你在 T?(T? t) 中说 T? 时,它们都指的是可为空的引用类型, 而不是 特殊的 Nullable<T>结构。您无法指定通用参数,以便将其视为 class 和可为 null 的值类型。

第二个错误只是因为 f(10)(所以 f<int>(10))被隐式地当作 int(因为没有可空引用 int 值这样的东西),所以 null 无效,就像您 if (10 is null).


如果 T 停止打开,而是添加约束,例如 where T : structT? 变为 System.Nullable<T> 而不是可为 null 的引用参数,因此代码变得与引入可空引用类型之前完全相同。