为什么C#内联如果结果与if不同?

时间:2013-12-20 19:01:52

标签: c# .net

这是我的代码:

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。

有什么问题!?

3 个答案:

答案 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的隐式转换,这是因为三元条件。