Warm tip: This article is reproduced from serverfault.com, please click

c#-可为空的对象必须有一个值

(c# - nullable object must have a value)

发布于 2009-12-13 11:08:19

异常描述中有悖论:可空对象必须有值(?!)

这就是问题:

我有一DateTimeExtended堂课,那有

{
  DateTime? MyDataTime;
  int? otherdata;

}

和一个构造函数

DateTimeExtended(DateTimeExtended myNewDT)
{
   this.MyDateTime = myNewDT.MyDateTime.Value;
   this.otherdata = myNewDT.otherdata;
}

运行此代码

DateTimeExtended res = new DateTimeExtended(oldDTE);

抛出一个InvalidOperationException消息:

可为空的对象必须有一个值。

myNewDT.MyDateTime.Value- 有效并且包含一个常规DateTime对象。

此消息的含义是什么,我做错了什么?

请注意,oldDTE不是null我已经删除了ValuefrommyNewDT.MyDateTime但由于生成的 setter 引发了相同的异常。

Questioner
Dani
Viewed
11
21.9k 2017-12-14 17:59:52

你应该行改变this.MyDateTime = myNewDT.MyDateTime.Value;,只是this.MyDateTime = myNewDT.MyDateTime;

你收到的异常.Value是在Nullable 属性中抛出的DateTime,因为它需要返回一个DateTime(因为这是.Value状态合同),但它不能这样做,因为没有DateTime返回,所以它抛出了一个异常。

通常,盲目调用.Value可空类型是一个坏主意,除非你事先知道该变量必须包含一个值(即通过.HasValue检查)。

编辑

DateTimeExtended是不引发异常的代码

class DateTimeExtended
{
    public DateTime? MyDateTime;
    public int? otherdata;

    public DateTimeExtended() { }

    public DateTimeExtended(DateTimeExtended other)
    {
        this.MyDateTime = other.MyDateTime;
        this.otherdata = other.otherdata;
    }
}

我是这样测试的:

DateTimeExtended dt1 = new DateTimeExtended();
DateTimeExtended dt2 = new DateTimeExtended(dt1);

添加.Valueonother.MyDateTime会导致异常。删除它可以消除异常。我认为你找错地方了。