为什么'null integer'在字符串转换后没有抛出'NullReferenceException'?

时间:2018-04-20 11:05:20

标签: c# nullreferenceexception

在下面的代码中,我得到空引用异常,因为string为null -

,所以很好
using System;

public class Test
{
  static string  r = null;
  public static void Main()
  {
    string s = "";

    try
    {
        s = r.ToString(); 
        Console.Write("Successful");
    }
    catch(Exception ex)
    {
        Console.WriteLine("exception via using null int...." + ex);
    }

    Console.WriteLine(s);
  }
}

输出:

exception via using null int....System.NullReferenceException: Object reference not set to an instance of an object

但是当我使用这段代码时,为什么我没有得到null引用异常? 可空整数变量是否具有空值?

using System;
public class Test
{
  public static void Main()
  {
    string s = "";
    int? i = null;

    try
    {
        s = i.ToString(); 
        Console.Write("Successful");
    }
    catch(Exception ex)
    {
        Console.WriteLine("exception via using null int...." + ex);
    }


    Console.WriteLine(s);
  }
}

输出:

Successful

4 个答案:

答案 0 :(得分:3)

int?是值类型,而不是引用类型。仅为引用类型抛出NullReferenceException

答案 1 :(得分:1)

因为S是内存中的一个对象并且它包含一个零carathers的字符串,但是r只是调用计算机来占有一个位置,但你没有说它是否是字符串所以toString是不可能的

当使用值声明S时,编译器确保它是字符串的对象,并且它从对象String中获取所有字符串方法。

答案 2 :(得分:1)

如果您为其分配值,则在打印时是否包含实际值?应该通过

访问int?的值
.Value

所以

int?.ToString() 

应该打印一个类型,而不是它的值,所以这里的null就可以了,另见:C# Nullable Types and the Value property

答案 3 :(得分:1)

T?表示法是System.Nullable<T>的简写。此类型是结构,而不是引用类型,并且不能是null。它有一个接受null引用的构造函数,它的作用是创建包含null的结构。