C# 乌里?与可空<Uri>

C# Uri? vs. Nullable<Uri>

我一直都知道在 C# 中可以用多种方式表示可为 null 的类型,不同之处通常被描述为“语法糖”。例如,以下...

// Case 1
int? nullableIntegerVar01;
// Case #2 - 
System.Nullable<int> nullableIntegerVar02;
// Case #3 - 
Uri? nullableUriVar01;
// Case #4 
System.Nullable<Uri> nullableUriVar02;

奇怪的是,上面的案例 #4 没有编译并抛出以下错误。

“错误 CS0453 类型 'Uri' 必须是不可为 null 的值类型才能将其用作泛型类型或方法 'Nullable' 中的参数 'T'”

我理解错误,我不明白原因 - 我希望这两种定义可空类型的方法可以互换。

此外,以下内容不起作用。

var testType = typeof(Uri);
var testNullableType = typeof(Nullable<>).MakeGenericType(testType);

任何人都可以提供见解吗?

对于值类型,例如 int 或结构(通常永远不会为 null),x?相当于 Nullable<x> (语法糖),它创建了一个新类型。对于引用类型,例如 Uri ?仅用作注释,它不会创建新类型(无论是否存在 ? 标记,这些都可以为 null)。

文档:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/nullable-reference-types

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/nullable-value-types