内部class级的公共和内部成员?

好吧,这可能有点愚蠢的问题,当然有明显的答案,但我很好奇,如果我错过了这里的任何微妙之处。

internal阶层申报的public成员与internal阶层申报的internal成员之间的可见性/可用性方面是否有区别?

即之间

 internal class Foo { public void Bar() { } } 

 internal class Foo { internal void Bar() { } } 

如果你将这个方法声明为public并且是virtual ,然后在一个派生类中public ,那么使用这个修饰符的理由是很清楚的。 但是,这是唯一的情况…我错过了别的吗?

考虑这种情况:

 public interface IBar { void Bar(); } internal class C : IBar { public void Bar() { } } 

这里C.Bar不能标记为内部; 这样做是错误的,因为C.Bar可以被D.GetBar()的调用者访问:

 public class D { public static IBar GetBar() { return new C(); } } 

public成员在internal课堂上还是internal

来自MSDN :

成员的可访问性永远不会超过其包含types的可访问性。 例如,以内部types声明的公共方法只有内部可访问性

想想这样,我会访问public财产….? 我无法看到的课程? 🙂

埃里克的答案在这种情况下是非常重要的,如果通过界面暴露出来,而不是直接影响, 那么取决于你是否处于与你打交道的成员的状况。

如果涉及到反思,那么这个成员是否公开是重要的。

例如,你甚至可以传递一个嵌套的私人类到一个WPF绑定,绑定将像往常一样针对公共属性。

刚刚面对另一个例子,这两个之间的差异,从WPF的XAML使用。

XAML:

 <Button Tag="{x:Static vm:Foo+Bar.e1}" /> 

带有internal枚举的代码成功编译:

 internal class Foo { internal enum Bar { e1, e2, } } 

但令人惊讶的是,将其改为public结果是错误的:

 internal class Foo { public enum Bar { e1, e2, } } 

最后一个例子会产生编译错误:

错误MC3064:标记内只能使用公共或内部类。 “酒吧”types不是公开的或内部的。

不幸的是,在这种情况下,我无法解释public的问题。 我的猜测是“只是因为WPF的工作方式”。 只要将嵌套类的修饰符更改为internal即可摆脱错误。

一个internal类的public成员可以重写public基础类的public成员,因此,如果是间接的话,会更加暴露一些。