我正在使用自定义角色提供程序,我创建了一个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'
我做错了什么?
答案 0 :(得分:5)
您也应该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
。它们不能包含任何访问修饰符。
答案 1 :(得分:4)
您通过RoleProvider
展示的基类CustomeRoleProvider
不是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();
}
}
答案 2 :(得分:0)
这意味着你已经定义了RoleProvider
...但是要成为一个私人类(这是真的吗?)。尝试将RoleProvider设为public
。
答案 3 :(得分:0)
尝试将RoleProvider类的访问说明符更改为public或internal。