为什么c#编译器允许返回值类型和变量类型的错误匹配?

时间:2014-10-14 09:14:46

标签: c# dynamic compiler-errors

请考虑以下代码:

static void Main()
{
    dynamic a = 1;
    int b = OneMethod(a);
}

private static string OneMethod(int number)
{
    return "";
}

请注意,type of breturn type of OneMethod不匹配。然而,它在运行时构建并抛出异常。 我的问题是为什么编译器会这样?或者这背后的哲学是什么?

背后的原因可能是Compiler does not know which OneMethod would be called, because a is dynamic.但是为什么它看不到只有一个OneMethod。在运行时肯定会有异常。

1 个答案:

答案 0 :(得分:3)

任何具有dynamic类型操作数的表达式都将具有动态类型。

因此,您的表达式OneMethod(a)返回一个动态键入的对象

因此代码的第一部分等同于

static void Main()
{
    dynamic a = 1;
    dynamic temp = OneMethod(a);
    int b = temp;
}

有一种方法可以证明为什么即使在你的情况下这是明智的,取决于你是否认为编译器应该根据你添加以下方法时改变该特定行的行为

private static T OneMethod<T>(T number)

现在编译器不会知道在运行时返回的类型。它甚至不知道调用哪种方法。通用或非通用。如果它在第一种情况下将赋值标记为编译错误然后通过添加完全不同的方法将其转移到运行时错误,您不会感到惊讶吗?