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

RunTimeBinderException when passing int[] to method having parameter type dynamic

下面的代码工作得很好,除非我将 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;
        }

失败的原因是因为在数组中,虽然它们实现了 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 时,参数不会隐式转换为 ICollection,它仍然是 int[] 并且 Count 根本无法通过该引用调用。