You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何‘null整数’转换为字符串后不抛出NullReferenceException?

为什么null整数转字符串不会抛出NullReferenceException?

先来看你给出的这段会抛出异常的代码:

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);
    }
}

这段代码里string r = null抛出NullReferenceException完全符合预期——因为string是引用类型,当变量是null时,意味着它没有指向任何实际的对象实例,调用实例方法ToString()自然会触发空引用异常。

那为什么“null整数”转字符串不会出问题?这里要先澄清一个点:C#里的基础值类型(比如int)本身是不能为null的,你说的“null整数”其实是可空值类型int?(等价于Nullable<int>),它是专门用来包装值类型、让其能表示null状态的结构体。

Nullable<T>这个结构体做了特殊处理:它重写了ToString()方法。当它处于null状态(也就是HasValue属性为false)时,调用ToString()会直接返回空字符串"",而不会尝试去调用底层值类型的方法,自然也就不会抛出空引用异常。

举个简单的例子验证一下:

int? nullInt = null;
string result = nullInt.ToString(); // 结果是"",没有任何异常

另外还有一种常见场景:如果是用Convert.ToString(null)来做转换,这个静态方法本身就内置了null处理逻辑,不管传入的是引用类型的null还是可空值类型的null,都会安全返回空字符串,同样不会触发异常。

核心差异可以总结成两点:

  • 引用类型的null:没有实际对象,调用实例方法必然触发NullReferenceException
  • 可空值类型的null:是一个合法的Nullable<T>结构体实例,只是内部没有值,其重写的方法会安全处理null状态

内容的提问来源于stack exchange,提问作者Harsh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:22:36