可空对象必须具有值

Dan*_*ani 175 c# nullable invalidoperationexception

异常描述中存在悖论:Nullable对象必须有一个值(?!)

这就是问题:

我有一个DateTimeExtended课,有

{
  DateTime? MyDataTime;
  int? otherdata;

}
Run Code Online (Sandbox Code Playgroud)

和一个构造函数

DateTimeExtended(DateTimeExtended myNewDT)
{
   this.MyDateTime = myNewDT.MyDateTime.Value;
   this.otherdata = myNewDT.otherdata;
}
Run Code Online (Sandbox Code Playgroud)

运行此代码

DateTimeExtended res = new DateTimeExtended(oldDTE);
Run Code Online (Sandbox Code Playgroud)

抛出一条InvalidOperationException消息:

可以为空的对象必须具有值.

myNewDT.MyDateTime.Value- 有效且包含常规DateTime对象.

这条消息的含义是什么?我做错了什么?

请注意,oldDTE不是null.我已经去除了ValuemyNewDT.MyDateTime,但相同的异常因抛出一个生成的制定者.

Yul*_*liy 184

您应该将该行更改this.MyDateTime = myNewDT.MyDateTime.Value;为justthis.MyDateTime = myNewDT.MyDateTime;

您收到的异常被抛入Nullable.Value属性中,因为它需要返回一个(因为那是状态的合同),但它不能这样做因为没有返回,所以它抛出异常. DateTimeDateTime.ValueDateTime

一般来说,盲目地调用.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我测试了这样:

DateTimeExtended dt1 = new DateTimeExtended();
DateTimeExtended dt2 = new DateTimeExtended(dt1);
Run Code Online (Sandbox Code Playgroud)

添加.Valueon other.MyDateTime会导致异常.删除它摆脱了异常.我觉得你在找错了地方.


Pro*_*one 8

当使用LINQ扩展方法(例如Select,Where),lambda函数可以被转换为SQL可能不完全相同的行为对你的C#代码.例如,C#的短路评估||&&转换为SQL的急切ANDOR.当您在lambda中检查null时,这可能会导致问题.

例:

MyEnum? type = null;
Entities.Table.Where(a => type == null || 
    a.type == (int)type).ToArray();  // Exception: Nullable object must have a value
Run Code Online (Sandbox Code Playgroud)

  • 我知道这个答案与OP的具体情况无关,但与他得到的Exception有关。另外,该页面是该异常在Google上的第一匹配,因此非常相关。 (3认同)

Pau*_*sey 5

尝试删除.value


O'R*_*ney 5

为了回答您的实际问题,“可为空对象必须有一个值”是什么意思?

它实际上是在说“您正在尝试获取可为空对象的 .Value,但它为 null,因此无法完成。”。

我认为这是一个写得很糟糕的错误消息。他们可能只是说“可空对象必须有一个值才能获取它的 .Value”

  • 我同意异常消息写得很糟糕。可空对象的要点是它不必具有值! (2认同)