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 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。アクセス修飾子を含めることはできません。

于 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、、classまたはのアクセス可能性を指定しない場合はstructinternalが暗示されます。

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();
    }
}
于 2013-01-31T11:56:11.390 に答える
0

それはあなたが定義したことを意味しますRoleProvider...しかしプライベートクラスになること(これは本当ですか?)。RoleProviderをaにしてみてくださいpublic

于 2013-01-31T11:49:00.930 に答える
0

RoleProviderクラスのアクセス指定子をpublicまたはinternalに変更してみてください。

于 2013-01-31T11:55:32.843 に答える