【发布时间】:2017-06-20 03:29:57
【问题描述】:
当使用Foo<Bar> 形式的动态参数调用方法时,如果Bar 是私有的,则会抛出RuntimeBinderException。为什么? (请参阅下面Test1 的Run 方法中的评论。)
public class Test1
{
public void Run()
{
dynamic publicList = ListProvider.GetPublic();
DoSomething(publicList);
dynamic privateList = ListProvider.GetPrivate();
DoSomething(privateList); // Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
}
private void DoSomething<T>(List<T> list) { }
static private class ListProvider
{
static public object GetPrivate() { return new List<A>(); }
static public object GetPublic() { return new List<B>(); }
private class A { }
public class B { }
}
}
要查看为什么这是不合理/不一致的,请注意下面的Test2,不使用泛型,并且在动态参数为私有时成功。
public class Test2
{
public void Run()
{
dynamic publicItem = ItemProvider.GetPublic();
DoSomething(publicItem);
dynamic privateItem = ItemProvider.GetPrivate();
DoSomething(privateItem); // No exception thrown
}
private void DoSomething<T>(T t) { }
static private class ItemProvider
{
static public object GetPrivate() { return new A(); }
static public object GetPublic() { return new B(); }
private class A { }
public class B { }
}
}
为什么使用泛型会/应该影响动态参数相对于访问修饰符的解析?
【问题讨论】: