什么是不一致的可访问性错误

本文关键字:访问 错误 不一致 什么 | 更新日期: 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'.

我哪里做错了?

什么是不一致的可访问性错误

你也应该让你的RoleProviderpublic

public class RoleProvider 
{
   ...
}
基类的

可访问性不能低于派生类。您的RoleProvider班可能比CustomRoleProvideraccess 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);
}

如果您没有指定interfaceclassstruct的可访问性,则隐含internal

interface成员总是public。 除非另有说明,否则classstruct成员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 类的访问说明符更改为公共或内部。