什么是不一致的可访问性错误
本文关键字:访问 错误 不一致 什么 | 更新日期: 2023-09-27 17:56:44
>我正在使用自定义角色提供程序,为此我创建了一个CustomRoleProvider
类并在其中实现了一些RoleProvider
方法,如下所示
public class CustomRoleProvider: RoleProvider
{
public override void CreateRole(string roleName)
{
throw new NotImplementedException();
}
public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}
}
所有方法都是公共的,但它显示错误
错误 4 - 不一致的可访问性:基类 "RoleProviderExample.RoleProvider"比类更难访问 'RoleProviderExample.CustomRoleProvider'.
我哪里做错了?
你也应该让你的RoleProvider
类public
。
public class RoleProvider
{
...
}
基类的可访问性不能低于派生类。您的RoleProvider
班可能比CustomRoleProvider
班access modifiers
少。
public class CustomRoleProvider : RoleProvider
{
public void CreateRole(string roleName)
{
throw new NotImplementedException();
}
public bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}
}
interface RoleProvider
{
void CreateRole(string roleName);
bool DeleteRole(string roleName, bool throwOnPopulatedRole);
}
实际上,您不必在接口上编写public
关键字。接口成员将自动public
。它们不能包含任何访问修饰符。
通过CustomeRoleProvider
公开的基类RoleProvider
不是public
。
如果将RoleProvider
声明为 public
则错误将消失。您不必为RoleProvider
提供public
构造函数。
或者,您可以将CustomRoleProvider
的可访问性降低到RoleProvider
的可访问性。这可能是最合适的答案,是否需要在程序集外公开CustomRoleProvider
?
如果RoleProvider
是一个接口,那么按照惯例,它是错误命名的,您可以将其重命名为 IRoleProvider
。无论如何,它仍然比CustomRoleProvider
更难访问.
像这样公开,
public interface IRoleProvider
{
void CreateRole(string roleName);
bool DeleteRole(string roleName, bool throwOnPopulatedRole);
}
如果您没有指定interface
、class
或struct
的可访问性,则隐含internal
。
interface
成员总是public
。 除非另有说明,否则class
和struct
成员private
。
最好指定,除非接口成员始终public
。
您的实现可能如下所示,override
关键字不应用于接口实现,除非它们重写可重写的基类实现。
public class CustomRoleProvider : IRoleProvider
{
public void CreateRole(string roleName)
{
throw new NotImplementedException();
}
public bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}
}
如果要显式实现接口,
public class CustomRoleProvider : IRoleProvider
{
public void IRoleProvider.CreateRole(string roleName)
{
throw new NotImplementedException();
}
public bool IRoleProvider.DeleteRole(
string roleName,
bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}
}
这意味着您已经定义了RoleProvider
...但要成为一个私人课程(这是真的吗?尝试使角色提供程序成为public
。
尝试将 RoleProvider 类的访问说明符更改为公共或内部。