使用三元语法将参数设置为DBNull.Value会产生错误?

Jim*_*Jim 18 .net c# enterprise-library ternary-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);
Run Code Online (Sandbox Code Playgroud)

所以基本上我是说,如果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);
}
Run Code Online (Sandbox Code Playgroud)

我搜索了其他帖子,发现了下面的帖子,但它并没有真正回答我的问题.

EntLib将"空"值绑定到参数的方法

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

在这个链接上有一个答案,但我想要一个更好的解释,因为它似乎是我的BS,这不起作用; 我称之为虫子!

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

Ant*_*ram 45

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

ilo.Description.Equals(string.Empty) 
     ? (object)DBNull.Value 
     : ilo.Description
Run Code Online (Sandbox Code Playgroud)

您看到的错误消息中显示了该问题.

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

字符串不是DBNull,DBNull不是字符串.因此,编译器无法确定表达式的类型.通过使用强制转换为公共基类型(在本例中object),您可以创建一个场景,然后编译器可以确定该字符串也可以转换为对象,因此表达式的类型可以确定为对象,这也非常适合您的代码行也期望作为DbParameter参数.


Sag*_*gar 5

这是我在另一个线程中发现的,它对我很有用:

yourVariable ?? (object)DBNull.Value
Run Code Online (Sandbox Code Playgroud)

希望对您有所帮助。