将 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
根本无法通过该引用调用。
下面的代码工作得很好,除非我将 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
根本无法通过该引用调用。