1

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

4 回答 4

5

你也应该RoleProvider上课public

public class RoleProvider 
{
   ...
}

基类的可访问性不能低于派生类。你的RoleProvider班级可能access modifiersCustomRoleProvider班级少。

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

于 2013-01-31T11:49:38.850 回答
4

RoleProvider您公开的基类CustomeRoleProvider不是public.

如果您声明RoleProviderpublic错误将消失。您不必提供RoleProvider构造public函数。


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


如果RoleProvider是一个接口,那么按照惯例,它是错误命名的,您可以将其重命名为IRoleProvider. 无论如何,那时它仍然不太容易获得CustomRoleProvider

像这样公开,

public interface IRoleProvider
{
    void CreateRole(string roleName);

    bool DeleteRole(string roleName, bool throwOnPopulatedRole);
}

如果您不指定interface,classstruct,的可访问性,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();
    }
}
于 2013-01-31T11:56:11.390 回答
0

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

于 2013-01-31T11:55:32.843 回答
0

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

于 2013-01-31T11:49:00.930 回答