代码之家  ›  专栏  ›  技术社区  ›  Dani

可为null的对象必须有一个值

  •  155
  • Dani  · 技术社区  · 15 年前

    可为null的对象必须具有值(?)

    这就是问题所在:

    我有一个 DateTimeExtended 那已经

    {
      DateTime? MyDataTime;
      int? otherdata;
    
    }
    

    还有一个构造器

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

    DateTimeExtended res = new DateTimeExtended(oldDTE);
    

    抛出 InvalidOperationException 我谨此致辞:

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

    myNewDT.MyDateTime.Value -是有效的,并且包含正则表达式 DateTime 对象

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

    注意 oldDTE 不是 null Value 从…起 myNewDT.MyDateTime

    7 回复  |  直到 10 年前
        1
  •  225
  •   Matt    7 年前

    你应该换线 this.MyDateTime = myNewDT.MyDateTime.Value; 公正 this.MyDateTime = myNewDT.MyDateTime;

    您收到的异常已在 .Value 可空 DateTime ,因为需要返回 日期时间 (因为这就是合同的目的 价值 但它不能这样做,因为没有

    总的来说,盲目地打电话是个坏主意 价值 必须 包含一个值(即通过 .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);
    

    价值 other.MyDateTime 导致异常。删除它可以消除异常。我想你找错地方了。

        2
  •  16
  •   Protector one reece    5 年前

    使用LINQ扩展方法时(例如。 Select , Where ),lambda函数可能会转换为SQL,其行为可能与您的C#代码不同。例如,对C#的短路进行评估 && || AND OR . 当您在lambda中检查null时,这可能会导致问题。

    例子:

    MyEnum? type = null;
    Entities.Table.Where(a => type == null || 
        a.type == (int)type).ToArray();  // Exception: Nullable object must have a value
    
        3
  •  8
  •   ArunPratap Miguel    5 年前

    试着扔掉这个盒子 .value

    DateTimeExtended(DateTimeExtended myNewDT)
    {
       this.MyDateTime = myNewDT.MyDateTime;
       this.otherdata = myNewDT.otherdata;
    }
    
        4
  •  2
  •   Cecil Has a Name    15 年前

    直接分配成员而不使用 .Value

    DateTimeExtended(DateTimeExtended myNewDT)
    {
       this.MyDateTime = myNewDT.MyDateTime;
       this.otherdata = myNewDT.otherdata;
    }
    
        5
  •  2
  •   Lee    15 年前

    在本例中,oldDTE为null,因此当您尝试访问oldDTE.Value时,由于没有值,因此引发InvalidOperationException。在您的示例中,您可以简单地执行以下操作:

    this.MyDateTime = newDT.MyDateTime;
    
        6
  •  0
  •   Pavel Radzivilovsky    15 年前

    看起来oldDTE.MyDateTime为null,所以构造函数试图获取它的值,这引发了错误。

        7
  •  0
  •   Juris    12 年前

    我在尝试访问空值对象的值时收到此消息。

    sName = myObj.Name;
    

    if(myObj != null)
      sName = myObj.Name;
    

    这很有效。

        8
  •  0
  •   KKG    4 年前

    我得到了这个解决方案,它正在为我工作

    if (myNewDT.MyDateTime == null)
    {
       myNewDT.MyDateTime = DateTime.Now();
    }