类型可访问性是否取决于它包含的文件?

时间:2010-07-05 00:25:31

标签: c#

如果我在一个文件中声明一个接口或一个类型为私有,那么它对该文件或命名空间是私有的吗?

编译器为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();
        }
    }
}

4 个答案:

答案 0 :(得分:3)

由于您没有为界面指定访问修饰符,因此默认为internal,低于public。这意味着只有同一个程序集中的代码才能知道它的存在。

公共类可以实现内部接口,因为同一个程序集中的其他代码会看到你的类带有接口,而外部的代码只会看到公共类,没有接口。

但是,在File2中,您正在构建该类“公共合同”的内部接口 - 也就是说,您的类是公共的,这意味着任何代码都可以看到它,但是为了使用它们还必须能够理解构造函数中的类型。由于构造函数中所需的类型之一是内部的,因此外部代码无法理解它,并且此契约无法实现。

答案 1 :(得分:1)

  

我不明白的是,MyClass可以使用界面,但ImageGetter类不能。

ImageGetter 可以使用该界面,它只是无法在其更容易访问的方法签名中呈现它。同样,如果MyClass试图在其中一个方法签名中使用它,您将得到相同的错误。请阅读以下内容。


顶级接口,结构和类默认为internal访问权限。要解决您的问题,请在接口声明之前添加public

C#中的

internal类型只能在同一个程序集中访问。 出于显而易见的原因,您不能在限制较少的签名中使用限制性更强的访问修饰符。 (例如,无法访问限制性更强的类型的人如何调用该函数?)

答案 2 :(得分:0)

不,代码所在的文件是无关紧要的。该接口是名称空间的私有,而不是文件。

错误消息不是因为ImageGetter类无法访问接口,而是因为无法从命名空间外部使用该类。

区别在于您如何使用界面。类MyClass仅实现接口,因此即使您不能使用该接口,仍然可以使用该类。 ImageGetter类中的构造函数需要对接口的引用,因此如果没有访问接口,则无法使用该类。

答案 3 :(得分:0)

接口和类默认为内部可访问性(因为没有类在命名空间内是私有的概念)。该错误解释了那里发生的事情 - IImageRepositoryImageGetter构造函数更不易访问(它是内部的),它将IImageRepository作为参数公开。

基本上ImageGetter上的公共方法公开了一个内部类型。这在C#中是不允许的。