views:

363

answers:

4

In c# 4.0, are dynamic method parameters possible, like in the following code?

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

I've many cool examples of the dynamic keyword in C# 4.0, but not like above. This question is of course inspired by how python works.

+2  A: 

Yes, you can do that. As stated in C# 4.0 specification, the grammar is extended to support dynamic wherever a type is expected:

type:
       ...
      dynamic

This includes parameter definitions, of course.

Mehrdad Afshari
A: 

Yes; see e.g.

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

or Chris' other blogs. Or grab VS2010 Beta2 and try it out.

Brian
Note that that article implies very inefficient late binding. Strong typing is your friend!
David Lively
@David: The dynamic behaviour in the DLR is pretty neatly done to be as efficient as is sanely possible. Yes, it's late-bound, but it's not as inefficient as you might expect.
Jon Skeet
+4  A: 

Yes, you can absolutely do that. For the purposes of static overload resolution, it's treated as an object parameter (and called statically). What you do within the method will then be dynamic. For example:

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");
    }
}

The "dynamic is like object" nature means you can't have one overload with just an object parameter and one with just a dynamic parameter.

Jon Skeet
+1  A: 

See documentation http://msdn.microsoft.com/en-us/library/dd264741(VS.100).aspx

Alexandra Rusina