9

三元运算符似乎存在一些类型混淆。我知道这已在其他 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 不能转换为字符串,所以那里没有运气。

有没有更简洁的方法来做到这一点(顺便说一句,不使用可空值?)

谢谢!

4

4 回答 4

23

您可以将您的第一条语句更改为:

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;
于 2010-08-09T22:59:27.437 回答
6

Value属性是 type object,所以你应该转换为object,而不是string

proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
    ? (object)DBNull.Value
    : (object)dest.Id;
于 2010-08-09T22:59:06.647 回答
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();

(改编自菲尔哈克

可读且简洁,不是吗?

于 2010-08-09T23:15:32.837 回答
3

怎么用??空合并运算符有关 ?? 的更多详细信息 操作员

proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;
于 2014-10-23T17:13:47.087 回答