我不确定为什么枚举必须公开才能与代表一起使用。我假设在命名空间级别上,整个应用程序都可以访问它,因为它在范围内。
namespace Test
{
enum Days
{
Monday,Tuesday
}
class TestingClass
{
public delegate void DelTest(Days d) /// ERROR, type enum is less accessible
}
}
答案 0 :(得分:3)
您的委托类型实际上是在internal
类中声明,因此它也是有效地内部(在某种意义上,无论如何)。这就是为什么您的示例如图所示将编译(添加分号后)。为了让它破裂,你必须公开TestingClass
。所以选项:
只是为了解释为什么在TestClass
公开时你的当前代码会被破坏:委托是公开的,因此在当前程序集之外可见。这意味着它的所有参数和返回类型也必须可见。
不要忘记C#中成员的默认访问级别始终是“可以为该成员明确指定的最严格的访问级别” - 因此对于顶级类型(包括枚举),默认可访问性为internal
。
答案 1 :(得分:1)
我假设在命名空间级别上,整个应用程序都可以访问它
不,整个程序集可以访问它。默认访问级别为internal
。
修改:当我更改您的代码以使用公开类:
时 enum Days { ... }
public class TestingClass { void M(Days d) {} }
我收到编译错误
可访问性不一致:参数类型'测试 .Days'比......更容易接近。
这就是@firefox所解释的:public
方法中的参数类型也必须是public
,以避免不一致。目前您的Days类型不太容易访问(internal
)。
答案 2 :(得分:1)
您的枚举的可访问性必须与代理匹配。想想你将如何称呼它。
new TestingClass.DelTest(Days.Monday).Invoke();
为了能够从不同的程序集执行此操作,Days枚举必须是公共的。如果您不希望它是公开的,请更改委托的可访问性以匹配枚举的可访问性,例如将两者都设为内部。
答案 3 :(得分:1)
这段代码也适用于我,加上了半结肠。
“参数类型比委托更难访问”的错误只会在引发类可访问性时出现,因为目前它们是使用相同的可访问性级别定义的。
e.g。
namespace Test
{
enum Days
{
Monday, Tuesday
}
public class TestingClass
{
public delegate void DelTest(Days d); // This will produce an error...
}
}