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

标签 c# dynamic compiler-errors

考虑以下代码:

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

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

请注意,b 的类型OneMethod 的返回类型 不匹配。尽管如此,它还是会在运行时构建并抛出异常。 我的问题是为什么编译器允许这样做?或者这背后的理念是什么?

这背后的原因可能是编译器不知道调用哪个OneMethod,因为a是动态的。但是为什么它看不到只有一个OneMethod。运行时肯定会出现异常。

最佳答案

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

因此你的表达式 OneMethod(a) 返回一个动态类型的对象

所以你的代码的第一部分等同于

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

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

private static T OneMethod<T>(T number)

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

关于c# - 为什么c#编译器允许返回值类型和变量类型的错误匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26356914/

相关文章:

c# - C#中字符串和StringBuilder的区别

c# - Visual Studio中损坏的Windows窗体

java - 泛型在 Eclipse 中编译和运行,但在 javac 中不编译

c# - 没有订阅 SqlDependency

c# - Angular 如何在 WebApi asp.net mvc 中工作

r - 使用 R/Shiny 创建动态数量的输入元素

dynamic - 直接执行的编译器设计

javascript - 动态改变JS

c# - log4net: Assembly System.Xml.XmlElement not referenced 错误,虽然没有使用

c# - 如何将逗号分隔的字符串转换为 List<int>