我有以下代码来设置一个参数,该参数将在 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);
}
我搜索了其他帖子,找到了下面的帖子,但它并没有真正回答我的问题。
我对 WHY 更感兴趣,因为显而易见的解决方法是只使用 if/else 语句而不是内联(三元)语法?
在这个链接上有一个答案,但我想要一个更好的解释,因为这对我来说似乎是废话,这不起作用;我会称之为错误!
http://msdn.microsoft.com/en-us/library/ty67wk28.aspx
编辑:2021 年 3 月 30 日,我写这个问题已经 9 年了。最后,从 C# 9 开始,此问题已得到修复。三元表达式现在支持混合类型,只要它们可以被隐式转换。