ASP.NET Core中IProductRepository可访问性不一致错误的解决求助
问题还原
我照着Adam Freeman《ASP.NET Core》里的代码实现SportsStore项目,结果碰到了编译错误。先贴一下我的代码:
ProductController.cs
namespace SportsStore.Controllers { public class ProductController : Controller { private IProductRepository repository; public ProductController(IProductRepository repo) { repository = repo; } public ViewResult List() => View(repository.Products); } }
IProductRepository.cs
namespace SportsStore.Models { interface IProductRepository { IQueryable<Product> Products { get; } } }
第一次报错:
Severity Code Description Project File Line Suppression State
Error CS0051 Inconsistent accessibility: parameter type 'IProductRepository' is less accessible than method 'ProductController.ProductController(IProductRepository)' SportsStore
我以为是字段访问权限的问题,把private IProductRepository repository改成public后,又跳出来新错误:
Severity Code Description Project File Line Suppression State
Error CS0052 Inconsistent accessibility: field type 'IProductRepository' is less accessible than field 'ProductController.repository' SportsStore
用的是Visual Studio 2017,代码和书里的完全一致,咋就不行呢?
问题根源
其实你找错方向啦!问题根本不在repository字段的访问修饰符上,而是你的IProductRepository接口没有加public修饰符!
在C#里,接口默认的访问级别是internal——也就是只能在当前程序集里访问。但你的ProductController是public的,它的构造函数也是public的,这就出现了矛盾:一个对外公开的方法,却用了一个只能内部访问的类型当参数,编译器肯定会报错。后来你把字段改成public,公开的字段用内部类型,自然也会触发类似的可访问性不一致错误。
解决方案
只需要给IProductRepository加上public修饰符就行,修改后的代码如下:
namespace SportsStore.Models { public interface IProductRepository { IQueryable<Product> Products { get; } } }
改完之后,不管你把repository字段设为private(这也是实际开发中推荐的做法,避免外部直接篡改)还是public,编译错误都会消失。
至于为什么书里的代码没问题?大概率是书里省略了public修饰符的写法(有些教程会简化这种默认公开的顶级成员说明),或者你在抄代码的时候不小心漏掉了这个关键的public。
内容的提问来源于stack exchange,提问作者Minnie

