除非我将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;
}
答案 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}},它仍然是ICollection
,int[]
根本无法通过该引用调用。