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

时间:2013-01-31 11:47:35

标签: c# asp.net class interface

我正在使用自定义角色提供程序,我创建了一个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'

我做错了什么?

4 个答案:

答案 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);
}

如果您未指定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();
    }
}

答案 2 :(得分:0)

这意味着你已经定义了RoleProvider ...但是要成为一个私人类(这是真的吗?)。尝试将RoleProvider设为public

答案 3 :(得分:0)

尝试将RoleProvider类的访问说明符更改为public或internal。