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

LCJ*_*LCJ 9 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);
Run Code Online (Sandbox Code Playgroud)

//代码2

string foo2 = null;
string test2 = Convert.ToString(foo2).Substring(0, Convert.ToString(foo2).Length >= 5 ? 5 : Convert.ToString(foo2).Length);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 33

来自以下文件Convert.ToString(string):

返回值
类型:System.String
返回不变.

因此null输入将产生null返回值.

来自以下文件Convert.ToString(object):

返回值
类型:valueSystem.String
的字符串表示形式,如果value为null.String.Empty

(这里"Nothing"的意思是"null".)

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

  • @SonerGönül:谢谢 - 看起来MSDN现在不仅对代码片段而且对于那种文档都是上下文敏感的.有趣. (2认同)
  • 谢谢......但这有点奇怪. (2认同)

Ham*_*yan 5

因为:

这是 Convert.ToString(object value) 的实现

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(); 
}
Run Code Online (Sandbox Code Playgroud)

这是 Convert.ToString(string value)

public static String ToString(String value) {
        Contract.Ensures(Contract.Result<string>() == value);  // We were always skipping the null check here.
        return value; 
    }
Run Code Online (Sandbox Code Playgroud)