我在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);
答案 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节介绍了这种打破这种打破方式的真正细节。