为什么不是“不一致的可访问性”?在接口列表中的泛型类型中使用私有嵌套类型
本文关键字:泛型类型 嵌套类型 列表 接口 不一致 访问 为什么不 | 更新日期: 2023-09-27 17:51:02
如果标题不是完全不言自明的,下面是让我困惑的代码:
public interface IFoo<T>
{
}
public class MyClass : IFoo<MyClass.NestedInMyClass>
{
private class NestedInMyClass
{
}
}
我很惊讶这个编译没有错误。感觉我暴露了一个private
型。这不应该是非法的吗?
MyClass.NestedInMyClass
甚至在"范围"中。如果我删除MyClass.
限定,它将无法编译。
(如果我将IFoo<>
更改为泛型类,那么它应该成为MyClass
的基类,这个是非法的,因为基类型必须至少与类型本身一样可访问)
我在Visual Studio 2010的c# 4编译器中尝试了这个
没有外部代码可以将对象强制转换为该接口,所以这不是可访问性问题。
public
类甚至允许实现private
或internal
接口——类似地,没有强制转换实际上可以从外部代码中发生。
Re:关于依赖T
的实现的讨论-如果你使用显式接口实现,你将被允许-因为接口的方法在这种情况下是有效私有的。例如:
public interface IFoo<T>
{
void DoStuff(T value);
}
public class MyClass : IFoo<MyClass.NestedInMyClass>
{
void IFoo<MyClass.NestedInMyClass>.DoStuff(MyClass.NestedInMyClass value)
{
}
private class NestedInMyClass
{
}
}
可以工作(因为接口实现方法没有由类本身公开)。
类实现接口的事实意味着可以创建接口类型的存储位置的代码可以在该存储位置中存储对该类型的引用,并且可以在该存储位置上使用接口成员。它不赋予代码任何新的能力,否则代码就不能创建该类型的存储位置。
让公共类Foo
实现私有或内部类型IBar
的接口,可以使访问IBar
的代码将Foo
引用强制转换为IBar
。事实上,Foo
可以被无法访问IBar
的代码访问,这并不意味着它也不会被具有这种访问权限的代码使用。事实上,定义Foo
的程序集或类想要使用Foo
的外部世界不可用的特性是很正常的;它实现IBar
的事实仅仅是这样一个特性。