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?
因为 10
是 int
类型。
应使用 f((int?)10) is null
或 f<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 : struct
,T?
变为 System.Nullable<T>
而不是可为 null 的引用参数,因此代码变得与引入可空引用类型之前完全相同。
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?
因为 10
是 int
类型。
应使用 f((int?)10) is null
或 f<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 : struct
,T?
变为 System.Nullable<T>
而不是可为 null 的引用参数,因此代码变得与引入可空引用类型之前完全相同。