Daizc
count.articles51
count.tags25
count.categories3
[Csharp]可为空的类型

[Csharp]可为空的类型

[Csharp]可为空的类型

一句话总结

值类型的不能?操作符的是通过Nullable<T>包装实现的,而引用类型由于本来就可以为空,所以?操作符只是个供编译器推断的标识而已。

参考资料

1
2
3
4
5

// 此处输出为 Nullable[int]
Console.WriteLine($"int?:\t{typeof(int?)}");
// 此处输出为 string
Console.WriteLine($"obj?:\t{typeof(string?)}");

可空值类型

一句话总结:
int?int是两个不一样的类型,int?其实是Nullable<int>的语法糖,因为值类型是直接指向具体值的,因此不能直接被指向null,必须经过包装。

1
2
3
4
5
int aNn = null; // Error CS0037 : 无法将 null 转换为“int”,因为后者是不可为 null 的值类型

int? a = null; // 其实是 Nullable<int> = new Nullable<>();
Console.WriteLine(a.Value); // 输出 null
Console.WriteLine(a.HasValue); // 输出 true

可空引用类型

一句话总结:
BaseWsRequest<object>? BaseWsRequest<object>其实是同一个类型,stringstring?也一样。因为他们都是引用类型,可以指向null,因此编译器并不会对他们额外进行包装。

1
2
3
4
5
6
7
string? str = null;
string strNn = null;

// 引用类型可以被声明为空引用
BaseWsRequest<object>? obj = null;
// 引用类型可以为null
BaseWsRequest<object> objNn = null;

copyright.author:Daizc
copyright.permalink:https://note.bequick.run/[Csharp]%E5%8F%AF%E4%B8%BA%E7%A9%BA%E7%9A%84%E7%B1%BB%E5%9E%8B/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可