似乎有一个在三元操作某种类型的混淆。我知道,这已经在其他SO线程得到解决,但它始终与nullables。此外,对于我来说,我真的只是寻找一个更好的办法。

我想能够使用

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和字符串之间没有转换成为可能,并为愚蠢的作为似乎考虑价值为对象,编译器踢回给我,我不得不照顾。在回答这个问题的可空版本是只投空字符串,并用它做;的DBNull不能被转换为字符串,虽然如此,没有运气。

是否有一个更简明的方式来做到这一点(不使用nullables,顺便?)

谢谢!

有帮助吗?

解决方案

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

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;

其他提示

Value 属性的类型object的,所以应该投射到object,不string

proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
    ? (object)DBNull.Value
    : (object)dest.Id;

或者你可以添加扩展的方法,如:

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();

(来自菲尔哈克改编)

可读和简洁,没有?

关于使用什么?空合并运算符有关的更多细节?操作者

proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top