11

我在 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);
4

3 回答 3

34

从以下文档Convert.ToString(string)

返回值
类型:System.String
原样返回。

所以null输入会产生一个null返回值。

从以下文档Convert.ToString(object)

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

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

所以null输入将导致一个空字符串(非空引用)返回值。

于 2012-11-22T14:05:42.740 回答
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(); 
}

这是 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; 
    }
于 2012-11-22T14:09:33.560 回答
-1

从这个链接

有 2 个 ToString 重载在这里起作用

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

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

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

C# 语言规范的第 7.4.3 节介绍了这种打破平局如何工作的真正令人毛骨悚然的细节。

于 2012-11-22T14:07:18.250 回答