【问题标题】:Can method parameters be dynamic in C#方法参数可以在C#中是动态的吗
【发布时间】:2010-12-15 23:36:10
【问题描述】:

在 c# 4.0 中,是否可以使用动态方法参数,如以下代码所示?

public string MakeItQuack(dynamic duck)
{
  string quack = duck.Quack();
  return quack;
}

我在 C# 4.0 中有很多很酷的动态关键字示例,但不像上面那样。这个问题当然是受到 python 工作原理的启发。

【问题讨论】:

    标签: dynamic parameters methods c#-4.0


    【解决方案1】:

    是的,你可以这样做。正如 C# 4.0 规范中所述,语法被扩展为支持 dynamic 任何需要 type 的地方:

    类型
    ...
    dynamic

    这当然包括参数定义。

    【讨论】:

      【解决方案2】:

      是的;参见例如

      http://blogs.msdn.com/cburrows/archive/2008/11/14/c-dynamic-part-vi.aspx

      或 Chris 的其他博客。或者获取 VS2010 Beta2 并尝试一下。

      【讨论】:

      • 请注意,该文章暗示后期绑定非常低效。强打字是你的朋友!
      • @David:DLR 中的动态行为非常巧妙地做到了尽可能高效。是的,它是迟到的,但它并没有你想象的那么低效。
      【解决方案3】:

      是的,您绝对可以这样做。出于静态重载解析的目的,它被视为object 参数(并静态调用)。你在方法中所做的将是动态的。例如:

      using System;
      
      class Program
      {
          static void Foo(dynamic duck)
          {
              duck.Quack(); // Called dynamically
          }
      
          static void Foo(Guid ignored)
          {
          }
      
          static void Main()
          {
              // Calls Foo(dynamic) statically
              Foo("hello");
          }
      }
      

      “动态就像对象”性质意味着您不能有一个只有object 参数的重载和一个只有dynamic 参数的重载。

      【讨论】:

      • 如果我正确理解了 ChrisB (blogs.msdn.com/b/cburrows/archive/2010/04/01/…) 的这篇更新文章,那么看来这种行为可能已经改变。听起来像调用总是动态分派的,根据运行时确定的参数类型选择重载。
      • @BitMask777:仅当 参数(或目标)之一是动态的。所以在我回答的代码中,Foo("hello") 没有任何动态参数,所以Foo(dyanmic) 是静态绑定的。
      【解决方案4】:
      猜你喜欢
      • 1970-01-01
      • 2013-01-27
      • 2011-06-29
      • 2013-06-19
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      相关资源
      最近更新 更多