说在前面
关于c#代码Convert.ToChar(null);出现非常,而object obj = null; Convert.ToChar(obj);//返回’\0’空字符题目详解。
为何会想到说这个题目呢?
今天在博乐功用下点评一篇文章“关于System.Convert那些事”中提出了这个题目:
Convert.ToChar(null);
直接如许挪用,实行时会发作非常;
而以下代码却不会出现非常!
object obj = null; Convert.ToChar(obj);//返回'\0'空字符
非常剖析
发作了 System.ArgumentNullException
检察细致信息,能够看到非常的细致信息,是在 System.Convert.ToChar(String value, IFormatProvider provider)发作了非常:
但经由过程挪用客栈,我们对毛病能更清晰的熟悉;
以下图,在发作非常的要领之间另有一层挪用:
System.Convert.ToChar(string value)
System.Convert.ToChar(string value),这才是题目的症结!
当实行Convert.ToChar(obj);时,obj的范例已明白了是object范例,所以挪用的是Convert.ToChar(object value);的完成:
public static char ToChar(object value) { if (value != null) { return ((IConvertible) value).ToChar(null); } return '\0'; }
而实行Convert.ToChar(null);时,null能够赋值给多种数据范例,而编译器在处置惩罚时默许把它当作了String范例,所以我们在挪用客栈中看到了中心的一步:System.Convert.ToChar(string value),完成以下:
public static char ToChar(string value) { return ToChar(value, null); }
所以才会在 System.Convert.ToChar(String value, IFormatProvider provider)发作了非常
public static char ToChar(string value, IFormatProvider provider) { if (value == null) { throw new ArgumentNullException("value"); } if (value.Length != 1) { throw new FormatException(Environment.GetResourceString("Format_NeedSingleChar")); } return value[0]; }
总结
究其原因,是编译器授与“null”的默许数据范例的题目,所以致使看似雷同的代码,却发作差别的效果。
这也涉及到多态和重载(多态是面向对象编程头脑的一种特性,重载是指要领能够依据差别的参数个数与范例,来完成多种功用,重载要领能够明白成多态的细致表现形式),假如只要Convert.ToChar(object value);这一种完成,也不会发作本文论述的题目,也不会有本文了。
以上就是关于c#代码Convert.ToChar(null);出现非常的详解(图)的细致内容,更多请关注ki4网别的相干文章!