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节介绍了这种打破领域的真正细节。
- WPF TextBox被切断了
- 为什么数据存储库不是静态的?
- 覆盖一些.Net Framework控件的绘图以更改其边框颜色?
- 在async / await中重入?
- PSCmdlet动态自动完成一个参数(如Get-Process)
- 控制器错误“Microsoft.AspNetCore.Mvc.Rendering.SelectListItem”中的MVC Core SelectList下拉列表
- VS 2010使用自定义计数器加载测试结果
- 如何在WPF应用程序中使用MVVM在InvokeCommandAction中将多个参数作为CommandParameter传递
- 使用DateTime.Now有什么问题。 作为唯一ID的主要部分?