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

时间:2012-11-22 14:00:44

标签: c#

我在C#控制台应用程序中有foo(object)和foo2(string)。代码2引发异常,而代码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);

3 个答案:

答案 0 :(得分:31)

来自Convert.ToString(string)的文档:

  

返回值
  输入:System.String
   value 未更改。

因此,null输入会产生null返回值。

来自Convert.ToString(object)的文档:

  

返回值
  输入:System.String
  的字符串表示形式,如果 value ,则为String.Empty为空。

(其中“Nothing”在这里的意思是“null”。)

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

答案 1 :(得分:3)

由于:

这是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<string>() == value);  // We were always skipping the null check here.
        return value; 
    }

答案 2 :(得分:-1)

从此Link

这里有2个ToString重载

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

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

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

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