2011-09-19 87 views
1

简单的代码:为什么MemberAccessException不抛出?

class Program 
{ 
    static void Main(string[] args) 
    { 
     A a = new A(); 

     //Expect MemberAccessException here 
     //(http://msdn.microsoft.com/en-us/library/system.delegate.method.aspx) 
     Console.WriteLine("Delegate.Method: " + a.ACallback.Method); 
     Console.ReadLine(); 
    } 
} 

public delegate void TestCallback(); 

class A 
{ 
    public TestCallback ACallback; 

    public A() 
    { 
     ACallback = new TestCallback(this.Some); 
    } 

    private void Some() 
    { 
     Console.WriteLine("Call Some"); 
    } 
} 

,并没有发现任何异常,为什么呢?

+1

为什么你期待'MemberAccessException'? – jason

+0

由于调用方无法访问委托所表示的方法,因此该方法是私有的。 – Nick

+0

在完全信任的情况下可能会禁用一些验证。 – CodesInChaos

回答

0

它在我看来像你的代码是完全有效的......如果你期待一个异常被抛出,因为你试图访问委托的私人成员,你的逻辑是不正确的。你正在通过该类的公共成员调用私有方法,所以这工作得很好。

使TestCallback专用会导致编译时错误我不知道你期望如何生成MemberAccessException?

+0

当我尝试访问委托的Method属性时,我期待异常(MemberAccessException)。由于调用方无法访问代表所代表的方法,因此该方法是私有的。 – Nick

+0

@Nick:你的假设是错误的,通过引用私有字段,属性或方法总是允许外部代码使用该“指针”所引用的内容,这是从C和C++的时间有效的,我问了同样的在12年前的大学问题,也很惊讶,但这是事情的工作方式:) –

+0

@Davide C和C++在这里没有关系。 – CodesInChaos

1

从MSDN:Delegate.Method Property

MemberAccessException:来电者不必由委托所表示的方法 访问(例如,如果该方法是私有的)。

但您的A.ACallbackpublic

+1

那么,当我可以获得异常MemberAccessException,而我尝试访问某些代表的属性“方法”? – Nick

相关问题