为什么c编译器允许返回值类型和变量类型的不正确匹配

本文关键字:类型 变量 不正确 为什么 编译器 返回值 | 更新日期: 2023-09-27 18:26:23

考虑以下代码:

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。运行时肯定会出现异常。

为什么c编译器允许返回值类型和变量类型的不正确匹配

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

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

所以代码的第一部分相当于

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

即使在您的情况下,争论为什么这是合理的一种方式取决于您是否认为编译器应该根据您添加以下方法来更改该特定行的行为

private static T OneMethod<T>(T number)

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