如果我在一个文件中声明一个接口或一个类型为私有,那么它对该文件或命名空间是私有的吗?
编译器为File2生成错误:'错误14可访问性不一致:参数类型'DIDemo1.IImageRepository'比方法'DIDemo1.ImageGetter.ImageGetter(DIDemo1.IImageRepository)'
更难访问我不明白的是,MyClass可以使用界面,但ImageGetter类不能。
File1中:
namespace DIDemo1 {
interface IImageRepository {
Image[] GetImages();
}
public class MyClass : IImageRepository {
#region IImageRepository Members
public Image[] GetImages() {
return new Image[] { };
}
#endregion
}
}
文件2:
namespace DIDemo1 {
public class ImageGetter {
IImageRepository _repo;
public ImageGetter(IImageRepository repository) {
_repo = repository;
}
public Image[] GetImages() {
return _repo.GetImages();
}
}
}
答案 0 :(得分:3)
由于您没有为界面指定访问修饰符,因此默认为internal
,低于public
。这意味着只有同一个程序集中的代码才能知道它的存在。
公共类可以实现内部接口,因为同一个程序集中的其他代码会看到你的类带有接口,而外部的代码只会看到公共类,没有接口。
但是,在File2中,您正在构建该类“公共合同”的内部接口 - 也就是说,您的类是公共的,这意味着任何代码都可以看到它,但是为了使用它们还必须能够理解构造函数中的类型。由于构造函数中所需的类型之一是内部的,因此外部代码无法理解它,并且此契约无法实现。
答案 1 :(得分:1)
我不明白的是,MyClass可以使用界面,但ImageGetter类不能。
ImageGetter 可以使用该界面,它只是无法在其更容易访问的方法签名中呈现它。同样,如果MyClass试图在其中一个方法签名中使用它,您将得到相同的错误。请阅读以下内容。
顶级接口,结构和类默认为internal
访问权限。要解决您的问题,请在接口声明之前添加public
。
internal
类型只能在同一个程序集中访问。
出于显而易见的原因,您不能在限制较少的签名中使用限制性更强的访问修饰符。 (例如,无法访问限制性更强的类型的人如何调用该函数?)
答案 2 :(得分:0)
不,代码所在的文件是无关紧要的。该接口是名称空间的私有,而不是文件。
错误消息不是因为ImageGetter
类无法访问接口,而是因为无法从命名空间外部使用该类。
区别在于您如何使用界面。类MyClass
仅实现接口,因此即使您不能使用该接口,仍然可以使用该类。 ImageGetter
类中的构造函数需要对接口的引用,因此如果没有访问接口,则无法使用该类。
答案 3 :(得分:0)
接口和类默认为内部可访问性(因为没有类在命名空间内是私有的概念)。该错误解释了那里发生的事情 - IImageRepository
比ImageGetter
构造函数更不易访问(它是内部的),它将IImageRepository
作为参数公开。
基本上ImageGetter
上的公共方法公开了一个内部类型。这在C#中是不允许的。