为什么不是“不一致的可访问性”?在接口列表中的泛型类型中使用私有嵌套类型

本文关键字:泛型类型 嵌套类型 列表 接口 不一致 访问 为什么不 | 更新日期: 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类甚至允许实现privateinternal接口——类似地,没有强制转换实际上可以从外部代码中发生。

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的事实仅仅是这样一个特性。