Convert.ToString对“NULL对象”和“NULL字符串”的行为有所不同

我在C#控制台应用程序中有foo( object )和foo2( string )。 代码2引发exception,而代码1正常工作。

你能解释一下它的行为吗(用MSDN参考)?

//代码1

 object foo = null; string test = Convert.ToString(foo).Substring(0, Convert.ToString(foo).Length >= 5 ? 5 : Convert.ToString(foo).Length); 

//代码2

 string foo2 = null; string test2 = Convert.ToString(foo2).Substring(0, Convert.ToString(foo2).Length >= 5 ? 5 : Convert.ToString(foo2).Length); 

Convert.ToString(string)的文档:

回报价值
键入: System.String
不变。

因此null输入将导致null返回值。

Convert.ToString(object)的文档:

回报价值
键入: System.String
value的字符串表示forms,如果value为null,则为String.Empty

(其中“Nothing”在这里表示“null”。)

因此null输入将导致空字符串(非空引用)返回值。

因为:

这是Convert.ToString(对象值)的实现

 public static string ToString(Object value) { return ToString(value,null); } public static string ToString(Object value, IFormatProvider provider) { IConvertible ic = value as IConvertible; if (ic != null) return ic.ToString(provider); IFormattable formattable = value as IFormattable; if (formattable != null) return formattable.ToString(null, provider); return value == null? String.Empty: value.ToString(); } 

这是Convert.ToString(字符串值)

 public static String ToString(String value) { Contract.Ensures(Contract.Result() == value); // We were always skipping the null check here. return value; } 

从这个链接 :

这里有2个ToString重载

 Convert.ToString(object o); Convert.ToString(string s); 

C#编译器本质上试图选择最适合输入的特定重载。 空值可转换为任何引用类型。 在这种情况下,字符串比对象更具体,因此它将被选为胜利者。

在作为对象的null中,您已将表达式的类型固化为对象。 这意味着它不再与字符串重载兼容,并且编译器选择对象重载,因为它是剩余的唯一兼容的。

C#语言规范的第7.4.3节介绍了这种打破领域的真正细节。