在异常描述中有一个悖论:
可空对象必须有值(?!)
这就是问题所在:
我有一个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不是空的。我已经从myNewDT中删除了值。MyDateTime,但由于生成的setter而抛出相同的异常。
你应该把这一行改一下。MyDateTime = myNewDT.MyDateTime.Value;就这样。MyDateTime = myNewDT.MyDateTime;
你收到的异常是在Nullable DateTime的. value属性中抛出的,因为它需要返回一个DateTime(因为这是. value契约的状态),但它不能这样做,因为没有DateTime要返回,所以它抛出了一个异常。
一般来说,在可空类型上盲目调用. value是一个坏主意,除非你事先知道该变量必须包含一个值(即通过. hasvalue检查)。
EDIT
下面是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);
在other上添加. value。MyDateTime导致异常。删除它可以摆脱异常。我觉得你找错地方了。
你应该把这一行改一下。MyDateTime = myNewDT.MyDateTime.Value;就这样。MyDateTime = myNewDT.MyDateTime;
你收到的异常是在Nullable DateTime的. value属性中抛出的,因为它需要返回一个DateTime(因为这是. value契约的状态),但它不能这样做,因为没有DateTime要返回,所以它抛出了一个异常。
一般来说,在可空类型上盲目调用. value是一个坏主意,除非你事先知道该变量必须包含一个值(即通过. hasvalue检查)。
EDIT
下面是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);
在other上添加. value。MyDateTime导致异常。删除它可以摆脱异常。我觉得你找错地方了。