我很难过。为什么第一行和第四行不能评估为空?
回答后修改
为了他人的利益,可以使用以下方式创建所需的行为:
boolFoo ? null : Convert.ToString(DBNull.Value)
这是有效的,因为Convert.ToString()
和null
意味着string
的常见类型。
答案 0 :(得分:3)
来自MSDN的?:
operator文档:
first_expression
和second_expression
的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换。
在这种情况下,null
似乎被隐式转换为System.Object
。从{MS}的文档进一步深入挖掘,如果value
为null
,则Convert.ToString(Object value)
会返回String.Empty
。
这与您帖子中的第六行不同,因为Convert.ToString(null)
不隐式地将null
转换为System.Object
(因为您不是使用?:
运算符。
答案 1 :(得分:2)
看起来他们评估为null
,但Convert.ToString(object)
将null
值返回为String.Empty
。
根据OP的评论进行编辑
在Convert.ToString(string)
的情况下,即使null
,也只返回字符串。由Reflector提供:
public static string ToString(string value)
{
return value;
}
答案 2 :(得分:1)
Convert.ToString((DBNull)null)
调用Convert.ToString(object)
重载,returns an empty string如果传递空值。这就是第一行和第四行计算为空字符串的原因。
Convert.ToString(null)
调用Convert.ToString(string)
重载,因为这是派生最多的适用版本。超载returns the argument unchanged。这就是为什么第六行的计算结果为null。
答案 3 :(得分:0)
它们是null
,它的类型只有DBNull
。