当我在int-或DateTime属性上调用GetType时, 我得到了预期的结果,但是在字符串属性上, 我得到一个NullReferenceException(?):
private int PropInt { get; set; }
private DateTime PropDate { get; set; }
private string propString { get; set; }
WriteLine(PropInt.GetType().ToString()); // Result : System.Int32
WriteLine(PropDate.GetType().ToString()); // Result : System.DateTime
WriteLine(propString.GetType().ToString()); // Result : NullReferenceException (?!)
有人可以解释为什么会这样?字符串-prop与int-prop有什么不同?
答案 0 :(得分:8)
如果属性的值为null
,那么在尝试访问对象方法或属性(例如GetType()
)时,您将获得NullReferenceException。像int
和DateTime
这样的原始类型是值类型,因此不能保存null
值,这就是GetType()
不会失败的原因成员职能。
答案 1 :(得分:2)
因为string是引用类型,而其他不是。默认情况下,DateTime和Int必须具有值,它们不能为空。
您必须了解的是编译器正在为您创建一个存储信息的变量。在C#3.0中,您不必显式声明它,但它仍然存在,因此它创建一个DateTime变量和一个int变量并将它们初始化为默认值,以免引起编译器错误。使用字符串,它不需要执行此操作(初始化默认值),因为它是引用类型。
答案 2 :(得分:2)
要强调其他答案所表示的内容,请将int更改为int?和DateTime到DateTime?并尝试再次运行代码。由于这些值现在可以保存空值,因此您将获得相同的异常。
答案 3 :(得分:1)
propString的初始值为null。我们不能执行null方法。如果你初步启动propString:propString =“”那么你可以执行GetType()而不用Exception
代码无例外:
private int PropInt { get; set; }
private DateTime PropDate { get; set; }
private string propString { get; set; }
propString = ""; // propString != null
WriteLine(PropInt.GetType().ToString()); // Result : System.Int32
WriteLine(PropDate.GetType().ToString()); // Result : System.DateTime
WriteLine(propString.GetType().ToString()); // Result : System.String