【问题标题】:What is inconsistent accessibility error?什么是不一致的可访问性错误?
【发布时间】:2013-01-31 11:47:34
【问题描述】:

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

我哪里做错了?

【问题讨论】:

  • 你的基类不是公开的

标签: c# asp.net class interface


【解决方案1】:

您也应该将RoleProvider 类设为public

public class RoleProvider 
{
   ...
}

基类的可访问性不能低于派生类。您的 RoleProvider 类的 access modifiers 可能少于 CustomRoleProvider 类。

    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。它们不能包含任何访问修饰符。

【讨论】:

  • 但是RoleProvider是一个接口,CustomRoleProvider是一个类,已经是public了。如何使 RoleProvider 接口公开?
  • @Anand,如果RoleProvider 是一个接口,那么override 关键字是虚假和误导性的,RoleProvider 的命名也是如此。
  • @Jodrell OP 想要编写它们。如果他想改变它们,它们当然是可删除的..
【解决方案2】:

您通过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 成员始终为 publicclassstruct 成员是 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是一个接口,CustomRoleProvider是一个类,已经是public了。如何使 RoleProvider 接口公开?
  • @Anand 接口成员自动公开
  • @Anand,我已经尽我所能扩展了我的答案。我希望它有助于清理您的理解并提高代码的一般可读性。
【解决方案3】:

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

【讨论】:

  • protected 仍然比 public 更难访问
  • 我的错。从错误中吸取教训。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多