【问题标题】:Operator '??' cannot be applied to operands of type 'System.DateTime'操作员 '??'不能应用于“System.DateTime”类型的操作数
【发布时间】:2013-11-06 07:09:57
【问题描述】:

我收到以下错误:

Operator '??' cannot be applied to operands of type 'System.DateTime'

 foreach (EndServReward r in reward)
                            {
                                if (con.State == ConnectionState.Closed)
                                {
                                    con.Open();
                                }
                                myIfxCmd.Parameters[0].Value = r.EmpNum ;
                                myIfxCmd.Parameters[1].Value = (r.ServDate) ?? DBNull.Value;
                            }

在哪里reward is List<EndServReward> reward,为什么会发生这种情况,以及如何解决?

【问题讨论】:

    标签: c# asp.net collections foreach operators


    【解决方案1】:

    ?? 是空合并运算符。
    将其应用于不能为 null 的值是没有意义的。

    【讨论】:

    • 为什么r.ServDate不能是null?!!我想检查这些是空属性还是没有设置(填充)值
    • @just_name 这就是它不能为空的原因:msdn.microsoft.com/en-us/library/vstudio/1t3y8s4s.aspx
    • 那么如果我不设置这些属性并插入数据库怎么办,这会产生任何错误吗?
    • DateTime 是一个保证用全零初始化的结构。全零等于DateTime.MinValue (0000-01-01),它将被插入到数据库中。
    • @Corak - SqlServer 不会在 datetime 列中接受 1753 之前的一年。它将拒绝 DateTime.MinValue (0001-01-01)
    【解决方案2】:

    默认情况下,nullcoalescing 运算符不能应用于本质上不可为空的类型,例如DateTime。如果您仍想使用它,则必须预见将 DateTime 用作可空类型,例如使用DateTime? dt;

    【讨论】:

      【解决方案3】:

      您的 r.ServDate 属性必须可以为空:

      public DateTime? ServDate { get; set; }
      

      DateTime 默认不可为空

      【讨论】:

        【解决方案4】:

        DateTime 是一个值类型。值类型不可为空——它们总是带有一些值。

        对于整数、双精度等也是一样的。

        您使用的运算符会检查该值是否为空,因此没有必要。

        但是,您可以考虑根据基值(例如 Min)检查该值。您实际上必须考虑这个变量的默认值是什么,如果可以接受,然后检查它。

        同样,考虑一个 int。你不检查它是否为空,但你可以检查它是否为零或负数。

        【讨论】:

          【解决方案5】:

          您可以按照其他答案中的建议将类型更改为可为空,或者在您的代码中添加这样的辅助方法:

          private bool IsDefault<T>(T value)
          {
              if (value == null)
                  return false;
              return value.Equals(default(T));
          }
          

          然后把代码改成这样:

          myIfxCmd.Parameters[1].Value = IsDefault<DateTime>(r.ServDate) ? (object)DBNull.Value : (object)r.ServDate;
          

          【讨论】:

            【解决方案6】:

            正如在其他答案中正确指出的那样,您不能在值类型 -DateTime 上使用 Null-Coalescing 运算符。

            在您尝试将myIfxCmd.Parameters[1].Value 分配给Null 之前。第一个问题是你在EndServReward 类中设置ServDate 属性的默认值是什么?当您创建对象本身时,最好将其转换为nullDateTime.MinServData 设置默认值。这将有助于在一个地方确定功能并提供一致的解决方案。

            您可以在创建时将其选为DateTime.MinNull,而不是在将其更新到数据库时。

            【讨论】:

              猜你喜欢
              • 2015-12-11
              • 2016-05-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-06-09
              • 2016-04-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多