c# - 使用三元语法将参数设置为 DBNull.Value 会出错?

标签 c# .net enterprise-library conditional-operator

我有以下代码来设置一个参数,该参数将在 INSERT 语句中用于设置 SQL Server 数据库中的 VARCHAR 列。我的值对象(名为 ilo)有一个名为 Description 的属性,它被初始化为 String.Empty,然后被设置为从 XML 读取的某个值,或者如果该 XML 元素为空,它就保持为 String.Empty。

所以当插入到数据库中时,如果该属性仍然设置为 String.Empty,我想让它插入一个空值。

database.AddInParameter(cmd, "@description", DbType.String, 
                           (ilo.Description.Equals(string.Empty)) ?
                            DBNull.Value :
                            ilo.Description);

所以基本上我是说,如果 ilo.Description 等于 string.empty,则将参数设置为 DBNull.Value,否则将其设置为 ilo.Description。

这会在 Visual Studio 中产生以下错误...

错误 141 无法确定条件表达式的类型,因为 'System.DBNull' 和 'string' 之间没有隐式转换

为什么?

奇怪的是,我可以毫无错误地执行以下操作,这应该与使用上面的内联条件语法完全相同!?!

if(ilo.Description.Equals(string.Empty))
{
    database.AddInParameter(cmd, "@description", DbType.String, DBNull.Value);
}
else
{
    database.AddInParameter(cmd, "@description", DbType.String, ilo.Description);
}

我搜索了其他帖子,找到了下面的帖子,但它并没有真正回答我的问题。

EntLib Way to Bind "Null" Value to Parameter

我对 WHY 更感兴趣,因为显而易见的解决方法是只使用 if/else 语句而不是内联(三元)语法?

在此链接上有某种答案,但我想要一个更好的解释,因为这对我来说似乎是在胡说八道,这行不通;我会称之为错误!

http://msdn.microsoft.com/en-us/library/ty67wk28.aspx

编辑:2021 年 3 月 30 日,我写这个问题已经 9 年了。最后,从 C# 9 开始,此问题已得到解决。三元表达式现在支持混合类型,只要它们可以隐式转换即可。

最佳答案

这是人们在使用条件运算符时遇到的常见错误。要修复它,只需将一个或两个结果转换为通用基类型即可。

ilo.Description.Equals(string.Empty) 
     ? (object)DBNull.Value 
     : ilo.Description

问题已在您看到的错误消息中揭示。

Type of conditional expression cannot be determined because there is no implicit conversion between 'System.DBNull' and 'string'

字符串不是 DBNull,DBNull 也不是字符串。因此,编译器无法确定表达式的类型。通过使用转换为公共(public)基类型(在本例中为 object),您创建了一个场景,编译器随后可以确定字符串也可以转换为对象,因此表达式的类型可以是确定为对象,这也很好地符合您的代码行还期望作为 DbParameter 参数的内容。

关于c# - 使用三元语法将参数设置为 DBNull.Value 会出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10853191/

相关文章:

c# - Xamarin 表格 : StackLayout with rounded corners

migration - Enterprise Library 5.0 是否向后兼容 Enterprise Library 4.1?

enterprise-library - 哪里可以得到政策注入(inject)的简单解释?

c# - 如何更新现有的共享文件夹属性?

.net - 多线程和数据库连接

c# - 缺少对 System.Diagnostics.Process 的引用

database - 仅使用连接字符串打开 Microsoft.practices.EnterpriseLibrary 数据库

c# - Mono .Net 支持异步等待吗?

c# - 如何在 WPF XAML 中使用行索引作为 DataGridCell 样式的多重触发器中的条件?

c# - try catch finally block 是如何工作的?