我刚刚遇到一个奇怪的错误:
private bool GetBoolValue()
{
//Do some logic and return true or false
}
Run Code Online (Sandbox Code Playgroud)
然后,在另一种方法中,这样的事情:
int? x = GetBoolValue() ? 10 : null;
Run Code Online (Sandbox Code Playgroud)
很简单,如果方法返回true,则为Nullable int
x 赋值10 .否则,将null赋给nullable int.但是,编译器抱怨:
错误1无法确定条件表达式的类型,因为
int
和之间没有隐式转换<null>
.
我疯了吗?
我对这个小C#quirk感到有点难过:
给定变量:
Boolean aBoolValue;
Byte aByteValue;
Run Code Online (Sandbox Code Playgroud)
以下编译:
if (aBoolValue)
aByteValue = 1;
else
aByteValue = 0;
Run Code Online (Sandbox Code Playgroud)
但这不会:
aByteValue = aBoolValue ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)
错误说:"不能隐式地将类型'int'转换为'byte'."
当然,这个怪物会编译:
aByteValue = aBoolValue ? (byte)1 : (byte)0;
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
编辑:
使用VS2008,C#3.5
假设两个类,都是同一个超类的后代,如下所示:
class MySuperClass{}
class A : MySuperClass{}
class B : MySuperClass{}
Run Code Online (Sandbox Code Playgroud)
然后这个赋值不会通过编译器:
MySuperClass p = myCondition ? new A() : new B();
Run Code Online (Sandbox Code Playgroud)
编译器抱怨A和B不兼容(无法确定条件表达式的类型,因为'A'和'B'之间没有隐式转换 [CS0173]).但它们都是MySuperClass类型,所以在我看来这应该有效.不是说这是一个大问题; 只需要一个简单的强制转换即可启发编译器.但肯定是C#编译器的一个障碍?你不同意吗?
可能重复:
无法确定条件表达式的类型?
我目前写了这样的声明:
byte? Col_8 = (Rad_8.SelectedValue == null) ? null : byte.Parse(Rad_8.SelectedValue);
Run Code Online (Sandbox Code Playgroud)
但它有这个错误:
无法确定条件表达式的类型,因为
'<null>'
和之间没有隐式转换'byte'
为什么我之后可以使用null ?
?如果相当于上面的代码没有if
声明怎么办?