gpt4 book ai didi

c# - 可空类型的方法

转载 作者:太空狗 更新时间:2023-10-30 00:37:16 26 4
gpt4 key购买 nike

有人可以解释为什么可以调用 null 上的方法吗?实例?

int? num = null;

var s1 = num.ToString();
var s2 = num.HasValue;
var s3 = num.GetHashCode();
var s4 = num.GetValueOrDefault();

var s5 = num.Value; // InvalidOperationException
var s6 = num.GetType(); // NullReferenceException

我可以检查 numnull在 Debug模式下,那怎么可能 ToString方法或 HasValue可以在 null 上调用 getter例如,但对于 ValueGetType这不可能?它们都是 Nullable<> 上的方法或属性打不打?

我自然会期待 Value setter/getter 返回 null值,类似于 HasValue返回 false .我也希望,GetType返回 Nullable<int>输入信息,或 num is int?num is Nullable<int>作品。为什么它不起作用?如何查看 num是可空类型吗?

创建实例不会改变任何内容:

Nullable<int> num = new Nullable<int>();

幕后是什么?

最佳答案

Nullable<T>有一点编译器的魔力使它看起来好像有一个null值(value)。但是没有。基本上,因为 Nullable<T>是值类型,不能是null首先。它的可空性取决于是否有值。这意味着您可以调用 HasValue (这很重要,因为这是编译器在您编写 num == null 时插入的内容)和其他不依赖于存在的值的方法。

具体几点:

  • ToString是一个类似于 null 的实现在字符串连接中使用时,值将转换为字符串,即生成空字符串。你也不是真的想要 ToString永远扔。
  • GetHashCode有必要放 Nullable<T>作为字典中的键,或将它们放入哈希集中。它也不应该抛出,所以当没有值(value)时它必须返回一些合理的东西。
  • documentation解释了一些基本概念。

但是,禁止在没有值时访问该值。作为Zohar PeledMarc Gravell ♦在评论中注意,这是调用 GetType 时隐含发生的事情:

It would seem logical that the compiler could just silently replace nullableValue.GetType() with typeof(SomeT?), but that would then mean that it always gives confusing answers when compared to

object obj = nullableValue;
Type type = obj.GetType()

You would expect this to work similarly, but obj.GetType() will always return either typeof(T) (not typeof(T?)), or throw a NullReferenceException because T? boxes to either a T or to null (and you can't ask a null what type it is)

编译器专门处理的构造映射或多或少如下:

num == null         → !num.HasValue
num != null → num.HasValue
num = null → num = new Nullable<int>()
num = 5 → num = new Nullable<int>(5)
(int) num → num.Value
(object) num → (object) num.Value // if HasValue
→ (object) null // if !HasValue

还有对运算符的额外支持,最重要的是与不可为空的比较运算符 T s 和各种潜在的运算符 null?? 这样的值,但这就是它的要点。

关于c# - 可空类型的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54532274/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com