开发者

Does a types accessibility depend on the file it's contained in?

开发者 https://www.devze.com 2023-01-06 04:19 出处:网络
If I declare an interface, or a type as private in one file, is it private to that file or the namespace?

If I declare an interface, or a type as private in one file, is it private to that file or the namespace?

The compiler generates an error for File2: 'Error 14 Inconsistent accessibility: parameter type 'DIDemo1.IImageRepository' is less accessible than method 'DIDemo1.ImageGetter.ImageGetter(DIDemo1.IImageRepository)'

What I don't understand is that MyClass can use the interface but ImageGetter class cannot.

File1:

namespace DIDemo1 {

    interface IImageRepository {

        Image[] GetImages();
    }

    public class MyClass : IImageRepository {

        #region IImageRepository Members

        public Image[] GetImages() {
            return new Image[] { };
        }

        #endregion
    }
}

File2:

namespace D开发者_如何学编程IDemo1 {

    public class ImageGetter {

        IImageRepository _repo;

        public ImageGetter(IImageRepository repository) {
            _repo = repository;
        }

        public Image[] GetImages() {

            return _repo.GetImages();
        }
    }
}


Since you did not specify an access modifier for your interface, it defaults to internal, which is lower than public. That means only code in the same assembly are aware of its existence.

A public class can implement an internal interface, because other code inside that same assembly would see your class with the interface, and code outside would simply see the public class, with no interface.

However, in File2, you are making an internal interface part of that class' public contract - that is, your class is public, which means any code can see it, but in order to use it they must also be able to understand the types in the constructor. Since one of the types required in the constructor is internal, external code cannot understand it, and this contract is impossible to fulfill.


What I don't understand is that MyClass can use the interface but ImageGetter class cannot.

ImageGetter can use the interface, it just can't present it in one of its method signatures which are more accessible. Likewise if MyClass tried to use it in one of its method signatures you'd get the same error. Read below.


Top level interfaces, structs, and classes default to internal access. To fix your problem put public before your interface declaration.

internal types in C# are accessible only within the same assembly. You can't use a more restrictive access modifier in a less restrictive signature for obvious reasons. (How could someone who can't access the more restrictive type call the function for example?)


No, which file the code is in is irrelevant. The interface is private to the namespace, not the file.

The error message is not because the ImageGetter class can't reach the interface, it's because the class can't be used from outside the namespace.

The difference lies in how you use the interface. The class MyClass only implements the interface, so you can still use the class even if you can't use the interface. The constructor in the ImageGetter class requires a reference to the interface, so you can't use that class without also having access to the interface.


Interfaces and classes default to internal accessibility (because there is no concept of a class being private inside a namespace). The error explains what happens there - IImageRepository is less accessible (it is internal) than ImageGetter constructor, which exposes IImageRepository as a parameter.

Basically a public method on ImageGetter exposes a type that is internal. This is not allowed in C#.

0

精彩评论

暂无评论...
验证码 换一张
取 消