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

C# 什么是不一致的可访问性错误?,c#,asp.net,class,interface,C#,Asp.net,Class,Interface,我正在使用自定义角色提供程序,为此我创建了一个CustomRoleProvider类,并在其中实现了一些RoleProvider方法,如下所示 public class CustomRoleProvider: RoleProvider { public override void CreateRole(string roleName) { throw new NotImplementedException(); } public override

我正在使用自定义角色提供程序,为此我创建了一个
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
。。。但是作为一个私人阶级(这是真的吗?)。尝试将RoleProvider设置为一个
公共

这意味着您已经定义了
RoleProvider
。。。但是作为一个私人阶级(这是真的吗?)。尝试将角色扮演者设置为公共的

您也应该将您的
角色扮演者设置为公共的

public class RoleProvider 
{
   ...
}
基类的可访问性不能低于派生类。您的
RoleProvider
类的类可能少于
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 class RoleProvider 
{
   ...
}
基类的可访问性不能低于派生类。您的
RoleProvider
类的类可能少于
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
关键字。接口成员自动
公开
。它们不能包含任何访问修饰符。

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

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

通过
CustomerProvider
公开的基类
RoleProvider
不可用
public

如果将
RoleProvider
声明为
public
错误将消失。您不必给
RoleProvider
a
public
构造函数


或者,您可以将
CustomRoleProvider
的可访问性降低为
RoleProvider
的可访问性。这可能是最合适的答案,您是否需要将
CustomRoleProvider
暴露在程序集之外


如果
RoleProvider
是一个接口,那么按照惯例,它会被错误命名,您可以将其重命名为
IRoleProvider
。在任何情况下,它都比
CustomRoleProvider
更难访问

这样公开,

public interface IRoleProvider
{
    void CreateRole(string roleName);

    bool DeleteRole(string roleName, bool throwOnPopulatedRole);
}
如果未指定
接口
结构
的可访问性,则隐含
内部

接口
成员始终是
公共的
<代码>类
结构
成员是
私有的
,除非另有规定

最好指定,除非接口成员总是
公共的

您的实现可能如下所示,接口实现不应使用
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();
    }
}

通过
CustomerProvider
公开的基类
RoleProvider
不是
public

如果将
RoleProvider
声明为
public
错误将消失。您不必给
RoleProvider
a
public
构造函数


或者,您可以将
CustomRoleProvider
的可访问性降低为
RoleProvider
的可访问性。这可能是最合适的答案,您是否需要将
CustomRoleProvider
暴露在程序集之外


如果
RoleProvider
是一个接口,那么按照惯例,它会被错误命名,您可以将其重命名为
IRoleProvider
。在任何情况下,它都比
CustomRoleProvider
更难访问

这样公开,

public interface IRoleProvider
{
    void CreateRole(string roleName);

    bool DeleteRole(string roleName, bool throwOnPopulatedRole);
}
如果未指定
接口
结构
的可访问性,则隐含
内部

接口
成员始终是
公共的
<代码>类
结构
成员是
私有的
,除非另有规定

最好指定,除非接口成员总是
公共的

您的实现可能如下所示,接口实现不应使用
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();
    }
}

你的基类不是public你的基类不是public
受保护的
public
My bad更难访问。从错误中吸取教训。
protected
public
My bad更难访问。但是RoleProvider是一个接口,CustomRoleProvider是一个类,它已经是公共的了。如何公开RoleProvider接口?@Anand,如果
RoleProvider
是一个接口,那么
override
关键字是虚假的和误导性的,正如
RoleProvider
的命名一样@Jodrell OP想要编写它们。如果他想更改它们,它们当然是可删除的。但是RoleProvider是一个接口,CustomRoleProvider是一个类,它已经是公共的了。如何公开RoleProvider接口?@Anand,如果
RoleProvider
是一个接口,那么
override
关键字是虚假的和误导性的,正如
RoleProvider
的命名一样@Jodrell OP想要编写它们。如果他想更改它们,它们当然是可删除的。但是RoleProvider是一个接口,CustomRoleProvider是一个类,它已经是公共的了。我怎么能