似乎三元运算符中存在某种类型的混淆。我知道这已经在其他SO线程中得到了解决,但它始终是无效的。另外,对于我的情况,我真的只是在寻找更好的方法。
我希望能够使用
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id;
但我坚持这个:
if (string.IsNullOrEmpty(dest.Id))
{
proc.Parameters[PARAM_ID].Value = DBNull.Value;
}
else
{
proc.Parameters[PARAM_ID].Value = dest.Id;
}
三元运算符失败,因为DBNull和字符串之间没有可能的转换,而且考虑到Value是对象时看起来很傻,编译器会将它踢回给我,我不得不关心。这个问题的可空版本的答案是将null转换为字符串并完成它;但是DBNull不能转换为字符串,所以没有运气。
有没有更简洁的方法来做到这一点(顺便说一下,没有使用nullables?)
谢谢!
答案 0 :(得分:20)
您可以将您的第一个语句更改为:
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;
答案 1 :(得分:6)
Value
属性的类型为object
,因此您应该转为object
,而不是string
:
proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
? (object)DBNull.Value
: (object)dest.Id;
答案 2 :(得分:6)
或者您可以添加扩展方法,例如:
public static class DBNullExtensions
{
public static object AsDBNullIfEmpty(this string value)
{
if (String.IsNullOrEmpty(value))
{
return DBNull.Value;
}
return value;
}
}
然后你可以说
proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty();
(改编自Phil Haack)
可读且简洁,不是吗?
答案 3 :(得分:3)
使用??怎么样? null-coalescing operator More details about ?? operator
proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;