2011-03-24 35 views
3

我不确定为什么enum必须公开以便与代表一起使用。我假设在命名空间级别,整个应用程序可以访问它,因为它在范围内。在命名空间级别枚举 - 仍然需要公开?

namespace Test 
{ 

    enum Days 
    { 
    Monday,Tuesday 
    } 

class TestingClass 
    { 
    public delegate void DelTest(Days d) /// ERROR, type enum is less accessible 
    } 
} 
+2

其实,这个编译罚款给我(在代理后添加缺少的分号后)。 – RQDQ 2011-03-24 10:54:00

+0

@RQDQ:谢谢你指出。我在我的回答中已经涵盖了各种不同的基础:) – 2011-03-24 11:04:42

回答

1

我以为当上命名空间层次,整个应用程序可以访问它

没有,整个装配可以访问它。默认访问级别是internal


编辑:当我改变你的代码使用公共类:

enum Days { ... } 
public class TestingClass { void M(Days d) {} } 

我得到一个编译错误

可访问性不一致:参数类型“测试 。天'比...

这就是@firefox解释的:public方法中的参数类型也必须是public,以避免不一致。目前您的天数类型不易访问(internal)。

1

您的枚举的可访问性必须匹配委托。想想你会怎么称呼它。

new TestingClass.DelTest(Days.Monday).Invoke(); 

为了能够从不同的程序集中完成此操作,必须公开Date枚举。如果您不希望它公开,请更改委托的可访问性以匹配枚举的可访问性,例如,设置为内部。

3

你的委托类型实际上声明是一个internal类中,所以它的有效内部太(在某种意义上,反正)。这就是为什么你的示例将编译(添加分号后)。为了让它休息,你必须公开发表TestingClass。所以选项:

  • 离开它,如图
  • 请委托明确内部,如果你想TestingClass是公共
  • 使枚举明确公开,如果你想一切是公共

只是为了解释为什么您的当前代码会被破坏,如果TestClass是公开的:代表将是公开的,并且因此在当前集合之外可见LY。这意味着它的所有参数和返回类型也必须可见。

不要忘记,C#中成员的默认访问级别总是“可以为该成员明确指定的最严格的访问级别” - 因此对于顶级类型(包括枚举),默认可访问性为internal

1

这段代码也适合我编译,并增加了分号。

只有在类可访问性提高时才会出现“参数类型不如委托人可访问性”的错误,因为目前它们是使用相同的可访问性级别定义的。

例如

namespace Test 
{ 
    enum Days 
    { 
     Monday, Tuesday 
    } 

    public class TestingClass 
    { 
     public delegate void DelTest(Days d); // This will produce an error... 
    } 
}