将int []传递给参数类型为dynamic的方法时出现RunTimeBinderException

时间:2018-03-17 10:18:24

标签: c# dynamic dynamic-language-runtime

除非我将GetCount参数类型从ICollection更改为dynamic,否则下面的代码工作完全正常 - 它会抛出RuntimrBinderException为什么在运行时Count属性不可用?

static void Main(string[] args)
        {
            var list = new int[] { 1, 2, 3 };
            var x = GetCount(list);
            Console.WriteLine(x);
        }
        private static int GetCount(ICollection array) /*changing array type to dynamic fails at runtime*/
        {
            return array.Count;
        }

1 个答案:

答案 0 :(得分:1)

失败的原因是因为在数组中,虽然它们实现了ICollection,但Count是明确实现的。只能通过接口类型引用来调用显式实现的成员。

请考虑以下事项:

interface IFoo 
{
    void Frob();
    void Blah();
} 

public class Foo: IFoo
{
     //implicit implementation
     public void Frob() { ... }

     //explicit implementation
     void IFoo.Blah() { ... }
}

现在:

var foo = new Foo();
foo.Frob(); //legal
foo.Blah(); //illegal
var iFoo = foo as IFoo;
iFoo.Blah(); //legal

在您的情况下,当参数键入ICollection时,Count是有效的调用,但是当使用dynamic时,参数不会隐式转换为{{ 1}},它仍然是ICollectionint[]根本无法通过该引用调用。