我在使用?:运算符的方法中返回可空类型时遇到了一些困难.
例如,这有效:
public static Int32? RunInt32Query(string query, KeyValueCollection parameters)
{
object scalar = RunScalarQuery(query, parameters);
if (scalar != null)
{
return Convert.ToInt32(scalar);
}
else
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
但是这个例子不起作用,它不会编译:
public static Int32? RunInt32Query(string query, KeyValueCollection parameters)
{
object scalar = RunScalarQuery(query, parameters);
return (scalar != null) ? Convert.ToInt32(scalar) : null;
}
Run Code Online (Sandbox Code Playgroud)
据我了解,这两种方法在高水平上几乎完全相同,但显然不是?
试试这个:
return (scalar != null) ? (Int32?)Convert.ToInt32(scalar) : null;
Run Code Online (Sandbox Code Playgroud)
在
return Convert.ToInt32(scalar);
Run Code Online (Sandbox Code Playgroud)
编译器知道目标类型是Int32?(基于方法声明),因此可以Convert.ToInt32(scalar)基于隐式转换自动转换表达式的结果.
使用条件运算符,编译器首先尝试确定表达式的类型(scalar != null) ? Convert.ToInt32(scalar) : null.为此,它评估两个结果表达式的类型,Convert.ToInt32(scalar)以及null.这些类型分别是Int32和Object.编译器并不明显两个表达式都可以转换为Int32?.