这个程序有两个错误:
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?中被忽略
编辑:带有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");我不明白为什么约束会改变结果。
发布于 2021-01-17 20:16:34
当您在T?中和(T? t)中说(T? t)时,它们都引用可空引用类型,而不是特殊的Nullable<T>结构。您无法指定泛型参数,以便将其视为类和可空值类型。
第二个错误仅仅是因为f(10) (所以f<int>(10))被隐式地当作一个int (因为没有可为空的引用int值),所以null是无效的,就像您做了if (10 is null)一样。
如果T不再打开,而是添加了一个约束(例如where T : struct ),那么T?就变成了System.Nullable<T>,而不是一个可空的引用参数,因此代码与引入可空引用类型之前完全相同。
发布于 2021-01-17 20:14:48
我不知道第一个错误,但第二个错误。
f(10) is null被推断为int而不是int?,因为10是int类型的。应该使用f((int?)10) is null或f<int?>(10) is null。
https://stackoverflow.com/questions/65765396
复制相似问题