C# 为什么不能重写受保护的内部方法?

C# 为什么不能重写受保护的内部方法?,c#,.net,inversion-of-control,virtual-functions,C#,.net,Inversion Of Control,Virtual Functions,C#避免用户重写内部受保护的方法。我知道有人问过这个问题,我发现了。但我不认为这是个好主意。以下是我的例子: // A.dll public abstract class A { public abstract void Method1(); internal protected abstract void Method2(); } // B.dll, ref A.dll public class B : A { public override void Metho

C#避免用户重写内部受保护的方法。我知道有人问过这个问题,我发现了。但我不认为这是个好主意。以下是我的例子:

// A.dll
public abstract class A {
    public abstract void Method1(); 
    internal protected abstract void Method2(); 
}

// B.dll, ref A.dll
public class B : A {
    public override void Method1(); 
    internal protected override void Method2(); 
}

public class B1 {
    public void MethodC(){
        var b = new B();
        // can access b.Method1
        // can access b.Method2
    }
}

// C.dll, ref A.dll and B.dll
public class C {
    public void MethodC(){
        var b = new B();
        // can access b.Method1
        // can not access b.Method2
    }
}
在这种情况下,方法2可以由B1访问,而不是由C访问。但是,由于内部保护不能被重写,所以这样做并不方便。你们怎么看

----添加注释---------


我的目的很清楚。我想让B1可以访问Method2,我不想让C访问Method2。 问题是C#不允许覆盖“内部保护”

----再次添加评论---------


我知道现在有什么问题了。这个问题很简单,但Eric Lippert的示例使它变得复杂。

内部修饰符意味着同一程序集的成员可以访问它。如果类C位于不同的程序集中,它将无法看到它所引用的程序集的内部方法。如果需要外部程序集才能访问程序集的内部成员,则可以向程序集B的程序集信息添加InternalSvisBletoatAttribute,以授予对程序集C的访问权限


或者,您可以让外部程序集中的某个类型继承自类型B,并且它将通过位于受保护范围内而获得访问权。然后,您可以按预期通过本地类型调用这些方法。

您的问题是什么?你想解决什么问题?您是否正在尝试覆盖方法2?因为你应该能做到。受保护的内部意味着您可以从程序集或任何派生类访问该方法。非常不清楚您有什么具体问题。关联问题解释了为什么它是唯一的解决方法。如果你只是想聊一聊你是否喜欢这个设计——这是一个错误的地方,如果你有具体的问题,需要这种混乱的访问修饰符组合——问你的具体问题。。。另外,澄清国际奥委会标签与这个问题的关系将是一个很好的补充,同时你也可以在帖子中澄清它。我的目的很明确。我想让B1可以访问Method2,我不想让C访问Method2。问题是C不允许覆盖内部受保护。InternalsVisibleToAttribute很有趣,但我不想限制特定的程序集。在我的例子中,我希望B1类有权访问Method2,但它超出了受保护的范围。C#不允许覆盖“内部保护”。嗯,我现在知道问题出在哪里了。这个问题很简单,但埃里克·利珀特的例子使它变得复杂。谢谢你的帮助。