在可空类型的方法

问题描述 投票:4回答:2

有人可以解释为什么它可以调用上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

我可以检查num处于调试模式null,所以怎么可能是ToString方法或HasValue吸气可以null实例调用,但ValueGetType是不可能的?所有这些都是方法或Nullable<>类型属性或不?

我自然会想到Value吸气回报null值,同样作为HasValue返回false。我期望太高,这GetType返回Nullable<int>键入信息,或num is int?num is Nullable<int>作品。为什么不工作?我怎么可以检查num是可空类型?

创建一个实例在不改变任何东西:

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

什么是幕后?

c# nullable
2个回答
7
投票

Nullable<T>有一点的编译器法宝,使得它看起来好像有一个null值。但是没有。基本上,由于Nullable<T>是一个值类型,它不能是null开始。它确定为空性是否有值与否。这意味着,你可以调用HasValue(这是很重要的,因为这就是当你写的编译器插入num == null)和不依赖于价值存在其他方法。

至于一些具体问题:

  • ToString是工作原理类似于如何null值字符串串联使用时,即产生一个空字符串被转换成字符串的实现。你也真的不希望ToString永远扔。
  • GetHashCode必要把Nullable<T>作为重点在字典中,或者将它们放入一个HashSet。它也应该不会丢,所以它返回的东西懂事时,有没有价值。
  • documentation解释了一下基本概念。

访问值时,没有一个是被禁止的,虽然。正如评论Zohar PeledMarc Gravell ♦注意,这是在调用GetType什么时候发生的隐式:

这似乎是合乎逻辑的编译器可能只是默默的nullableValue.GetType()取代typeof(SomeT?),但随后这将意味着相比时它总是给混乱的答案

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

你可能会认为这类似的工作,但obj.GetType()总是返回要么typeof(T)(不typeof(T?)),或抛出一个NullReferenceException因为T?盒到任何一个Tnull(和你不能要求一个null它是什么类型)

结构的编译器特别处理的映射是多少如下:

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

有运营商,最重要的比较运算符非空的Ts和像null潜在??值工作各个运营商额外的支持,但是这是它的要点。


0
投票

不是一个真正的答案,而只是一个音符。你写:

我自然会想到Value吸气回报null

没有!该Nullable<T>存在的真正原因是为了保护你获得null值没有检查。

© www.soinside.com 2019 - 2024. All rights reserved.