【问题标题】:C# ?? null coalescing operator questionC# ??空合并运算符问题
【发布时间】:2026-01-17 06:25:01
【问题描述】:

我已将 Person 类属性 Birthday 定义为 nullable DateTime? ,那么为什么 null 合并运算符不能在以下示例中工作?

cmd.Parameters.Add(new SqlParameter("@Birthday",
   SqlDbType.SmallDateTime)).Value =       
     person.Birthday ?? DBNull.Value; 

我得到的编译器错误是“运算符'??'不能应用于“System.DateTime?”类型的操作数?和'System.DBNull'"

以下也有编译错误:

cmd.Parameters.Add(new SqlParameter("@Birthday", 
  SqlDbType.SmallDateTime)).Value = 
   (person.Birthday == null) ? person.Birthday:DBNull.Value;

我按照 Refactor 的建议向 (object) 添加了一个强制转换,它编译了,但没有正常工作,并且在这两种情况下,值都作为 null 存储在 sqlserver db 中。

SqlDbType.SmallDateTime)).Value =       
         person.Birthday ?? (object)DBNull.Value;

有人可以解释这里发生了什么吗?

我需要使用以下笨拙的代码:

   if (person.Birthday == null) 
    cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value 
      = DBNull.Value;
     else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value = 
          person.Birthday;

【问题讨论】:

  • 从另一个帖子中得到这个:SqlDbType.SmallDateTime)).Value = person.Birthday ?? (对象)DBNull.Value;谢谢!

标签: c# dbnull null-coalescing-operator


【解决方案1】:

问题是DateTime?DBNull.Value 不是同一类型,因此您不能对它们使用空合并运算符。

在您的情况下,您可以执行person.Birthday ?? (object)DBNull.Valueobject 类型的值传递给Add()

【讨论】:

    【解决方案2】:

    我更喜欢在执行查询之前迭代我的参数,根据需要将所有 null 实例更改为 DBNull,例如:

    foreach (IDataParameter param in cmd.Parameters)
        if (param.Value == null)
            param.Value = DBNull.Value;
    

    这让我可以保留空值,然后简单地将它们全部换掉。

    【讨论】:

    • 我的问题是事后迭代参数的额外开销,而不是立即处理它们。
    【解决方案3】:

    您的第一个问题是对于???: 运算符,任一选择的对象必须是相同类型。在这里它们是不同的类型。

    【讨论】: