我刚刚遇到了最奇怪的事情,我有点介意=此刻被吹了......
下面的程序编译得很好,但是当你运行它RuntimeBinderException
时,当你尝试阅读时会得到一个Value
.'object' does not contain a definition for 'Value'
class Program
{
interface IContainer
{
int Value { get; }
}
class Factory
{
class Empty : IContainer
{
public int Value
{
get { return 0; }
}
}
static IContainer nullObj = new Empty();
public IContainer GetContainer()
{
return nullObj;
}
}
static void Main(string[] args)
{
dynamic factory = new Factory();
dynamic container = factory.GetContainer();
var num0 = container.Value; // WTF!? RuntimeBinderException, really?
}
}
这是令人兴奋的部分。将嵌套类型移到类Factory+Empty
之外Factory
,如下所示:
class Empty : IContainer
{
public int Value
{
get { return 0; }
}
}
class Factory...
程序运行得很好,有人愿意解释这是为什么吗?
编辑
在我的编码冒险中,我当然做了一些我应该首先考虑的事情。这就是为什么你看到我对私有类和内部类之间的区别有点漫不经心。这是因为我设置了InternalsVisibleToAttribute
,这使得我的测试项目(在这种情况下正在消耗位)的行为方式与它们的行为方式相同,这完全是设计使然,尽管从一开始就暗示了我。
阅读 Eric Lippert 的答案以获得对其余部分的良好解释。
真正让我感到警惕的是,动态绑定器考虑到了实例类型的可见性。我有很多 JavaScript 经验,作为一名真正没有公共或私有之类的 JavaScript 程序员,我完全被可见性很重要的事实所愚弄,我的意思是毕竟,我访问这个成员就像它是公共接口类型(我认为动态只是反射的语法糖),但动态绑定器不能做出这样的假设,除非你给它一个提示,使用一个简单的演员。