18

如果标题不完全不言自明,这是让我感到困惑的代码:

public interface IFoo<T>
{
}

public class MyClass : IFoo<MyClass.NestedInMyClass>
{
  private class NestedInMyClass
  {
  }
}

我很惊讶这个编译没有错误。感觉就像我在暴露一种private类型。这不应该是非法的吗?

也许你的答案只是“没有规则反对,那为什么不可以呢?” MyClass.NestedInMyClass也许即使在“范围”内也同样令人惊讶。如果我删除MyClass.资格,它将无法编译。

(如果我更改IFoo<>为泛型,然后它应该成为的基类MyClass,这非法的,因为基类型必须至少与类型本身一样可访问。)

我用 Visual Studio 2010 的 C# 4 编译器尝试了这个。

4

2 回答 2

10

没有外部代码可以对象转换为该接口,因此这不是可访问性问题。

public甚至允许类实现privateinternal接口 - 同样,外部代码实际上不会发生强制转换

回复:关于依赖的实现的讨论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
  {
  }
}

工作(因为接口实现方法不被类本身公开)。

于 2013-01-07T15:50:44.040 回答
1

类实现接口的事实意味着可以创建接口类型的存储位置的代码可以在该存储位置存储对该类型的引用,并且可以使用该存储位置上的接口成员。它没有提供任何新的编码能力,否则将无法创建该类型的存储位置。

让一个公共类Foo实现一个私有或内部类型的接口,IBar使得可以访问的代码可以IBarFoo引用转换为IBar. Foo无法访问的代码可以访问的事实IBar绝不意味着它也不会被具有此类访问权限的代码使用。Foo实际上,定义的程序集或类想要使用Foo外部世界不可用的特性是很正常的。它实现的事实IBar只是这样一个功能。

于 2013-01-07T16:27:38.670 回答