为什么C#推断这种类型是动态的?

时间:2017-11-16 02:34:37

标签: c# type-inference

我有以下代码。

public static void GuessTheType()
{
    dynamic hasValue = true;
    dynamic value = "true";

    var whatami1 = hasValue ? (string)value : null;
    var whatami2 = hasValue ? bool.Parse(value) : true;
    var whatami3 = hasValue ? (bool)bool.Parse(value) : true;
}

编译器为whatami1推断的类型是string 编译器为whatami2推断的类型是dynamic 编译器为whatami3推断的类型为bool

为什么第二种类型不是bool

2 个答案:

答案 0 :(得分:2)

要扩展PetSerAl的评论,该评论解释为什么它被视为动态的,您可以通过将值转换为字符串来避免将bool.Parse的调用视为动态:

var whatami2 = hasValue ? bool.Parse((string)value) : true;

答案 1 :(得分:1)

Casting是我们断言(对编译器来说)一个对象确实是别的东西 - 例如:

var whatami1 = hasValue ? (string)value : null;
var whatami3 = hasValue ? (bool)bool.Parse(value) : true;

最后,解析是从没有内在关系的表单中解释一个值 - 即动态(即值)和var(即whatami2)之间没有直接关系,但我们可以解析:

var whatami2 = hasValue ? bool.Parse(value) : true;