【问题标题】:Method overloading with dynamic data types动态数据类型的方法重载
【发布时间】:2020-05-30 18:25:23
【问题描述】:

为什么编译器会以以下方式限制重载方法,我在使用动态类型参数的更新方法中遇到编译错误。

错误 - 类型“程序”已经定义了一个具有相同参数类型的名为“更新”的成员

static void update(string name)
    {

    }
static void update(object name)
    {

    }

static void update(dynamic name)
    {

    }

【问题讨论】:

  • 问题是:dynamic 可能是任何东西。包括stringobject。那么,在使用dynamic时,编译器应该如何确定使用哪个重载呢?
  • this 回答你的问题了吗?
  • 这能回答你的问题吗? Overloading Method with dynamic and other types

标签: c# .net oop


【解决方案1】:

当你使用dynamic参数类型时,即

static void update(dynamic name)
{
}

编译器将您的方法的签名更改为使用object,即

static void update(object name)
{
}

然后在您的方法主体中插入一些“魔法”,以便将name 视为动态类型的对象。然而,这引入了一个重要的限制:你不能有另一个方法 update 接受 object,因为你已经有了一个。

从语言设计者的角度考虑这个重载:当你看到在 objectdynamic 之间调用重载时,没有直观的方法来解决平局,因为 object 和 @ 987654331@ 可以容纳任何类型的对象。因此,无论dynamic 的底层实现如何,无论如何都应该禁止这样的重载。

【讨论】:

    【解决方案2】:

    因为dynamic 也是object 的一个类型。您可以检查生成的 IL 代码。所以它给出了编译错误

    static void update(object name)
        {
    
        }
    
    static void update(dynamic name)
        {
    
        } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      • 2013-01-24
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      相关资源
      最近更新 更多