C# ??空合并运算符的问题
-
26-09-2019 - |
题
我已经定义的类的人强>属性的生日强>作为<强>可为空的DateTime?下,为什么不应该空合并运算符在下面的例子中的工作?
cmd.Parameters.Add(new SqlParameter("@Birthday",
SqlDbType.SmallDateTime)).Value =
person.Birthday ?? DBNull.Value;
编译器ERR我是“运算符‘?’不能适用于类型的操作数“的System.DateTime?和 'System.DBNull'”
也下面得到了一个编译错误:
cmd.Parameters.Add(new SqlParameter("@Birthday",
SqlDbType.SmallDateTime)).Value =
(person.Birthday == null) ? person.Birthday:DBNull.Value;
我添加了一个浇铸到(对象)所推荐的重构,并且它编译,但没有正常工作并将该值存储在SQLSERVER分贝如在这两种情况下空。
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;
解决方案
的问题是,DateTime?
和DBNull.Value
是不一样的类型,所以你不能使用空它们的聚结操作。
在你的情况可以执行person.Birthday ?? (object)DBNull.Value
通过到object
传递类型Add()
的值
其他提示
我更喜欢遍历我的参数只是执行查询,改变空的所有实例的DBNull酌情,例如之前:
foreach (IDataParameter param in cmd.Parameters)
if (param.Value == null)
param.Value = DBNull.Value;
这让我离开的空值原样,只是换出来集体更高版本。
您第一个问题是,对于??
或?:
操作者,为任一选择的对象必须是相同的类型。这里它们是不同的类型。
不隶属于 StackOverflow