为什么MemberAccessException不抛出?
简单的代码:为什么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");
}
}
,并没有发现任何异常,为什么呢?
它在我看来像你的代码是完全有效的......如果你期待一个异常被抛出,因为你试图访问委托的私人成员,你的逻辑是不正确的。你正在通过该类的公共成员调用私有方法,所以这工作得很好。
使TestCallback专用会导致编译时错误我不知道你期望如何生成MemberAccessException?
当我尝试访问委托的Method属性时,我期待异常(MemberAccessException)。由于调用方无法访问代表所代表的方法,因此该方法是私有的。 – Nick
@Nick:你的假设是错误的,通过引用私有字段,属性或方法总是允许外部代码使用该“指针”所引用的内容,这是从C和C++的时间有效的,我问了同样的在12年前的大学问题,也很惊讶,但这是事情的工作方式:) –
@Davide C和C++在这里没有关系。 – CodesInChaos
从MSDN:Delegate.Method Property
MemberAccessException:来电者不必由委托所表示的方法 访问(例如,如果该方法是私有的)。
但您的A.ACallback
是public
。
那么,当我可以获得异常MemberAccessException,而我尝试访问某些代表的属性“方法”? – Nick
为什么你期待'MemberAccessException'? – jason
由于调用方无法访问委托所表示的方法,因此该方法是私有的。 – Nick
在完全信任的情况下可能会禁用一些验证。 – CodesInChaos