这是我的代码:
object w = 44;
var k1 = (w is double
? ((Convert.ToSingle(w)))
: ((unchecked((uint)Convert.ToInt64(w)))));
if (w is double)
{
w = 22;
}
结果是k1
= 44.0和w
== 44;
我想知道为什么结果会有所不同!
我们假设w
为双倍,在这种情况下,k1
应为44.0,w
应为22。
现在让我们假设w
不是双倍的,在这种情况下k1
应该是44而w
应该是44。
有什么问题!?
答案 0 :(得分:10)
无论k1
的类型是什么,用于初始化w
的条件表达式的类型都是相同的。编译器必须根据2个可能值的类型在编译时确定条件表达式类型。
cond ? float: uint
这些类型不一样,但uint
可以隐式转换为float
,因此编译器会选择它作为返回类型
答案 1 :(得分:2)
w
是一个int(44)。
三元表达式的类型是float,因此k1
是float。
因此,执行三元组的“假”分支,k1
为:
k1 = (float)((unchecked((uint)Convert.ToInt64(w)))))
答案 2 :(得分:1)
观察:
object w = 44;
object k1 = (w is double ? (object)((Convert.ToSingle(w))) : (object)((unchecked((uint)Convert.ToInt64(w)))));
if (w is double)
{
w = 22;
}
Console.WriteLine("{0}, {1}", w.GetType(), k1.GetType());
Console.ReadLine();
魔术,它现在告诉你它是一个uint: - )
问题是从uint到float的隐式转换,这是因为三元条件。