为什么null语句ToString()返回一个空字符串?

Mis*_*sky 16 c# nullable

我只是想知道下两个语句之间有什么区别:

  1. 导致NullReferenceException - 没关系.

    object test1 = default(int?);
    object result = test1.ToString();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 返回一个空字符串"",为什么?

    object test2 = default(int?).ToString();
    
    Run Code Online (Sandbox Code Playgroud)
  3. 这与2相同.

    int? test3 = null;
    if (test3.ToString() == string.Empty) //returns true
    {
        Console.WriteLine("int? = String.Empty, isn't it strange?").
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 而且只是为了好玩 - 我可以证明bool可以等于int值(嗯,怎么样?bool只能是false,或者是true,而int永远不会那样).

    if (default(int?).ToString() == default(bool?).ToString()) //returns true because both are empty strings
    {
        Console.WriteLine("int = bool");
    }
    
    Run Code Online (Sandbox Code Playgroud)

注意: default(int?)返回null.

Ser*_*rvy 29

int?是一个Nullable<int>. Nullable是一个结构,它使它成为值类型,而不是引用类型. test3实际上并未设置为null.分配null给它实际上会导致创建一个新结构,只需HasValue将该结构的字段设置为false而不是true.(需要特殊的编译器支持才能进行这种隐式转换;因此您无法拥有自己的MyNullable<T>类型来执行此操作.)

由于可空对象具有实际值,因此它可以调用ToString并提供有意义的值,在本例中为空字符串.

当您通过将该值置于object变量中来装入该可空值时,将导致实际 null值存储在该变量中,这就是为什么在调用其上的方法时获得NRE的原因.

当一个可以为空的值类型被装箱时,它不会包含可空值类型; 相反,如果它没有值,它会分配null给对象,如果它有一个值,那么该基础值将被解包然后装箱.(此行为需要来自运行时的特殊支持,这是您无法创建自己的MyNullable<T>类型的另一个原因.)