8

この質問で説明されているように、プロパティに内部ゲッターと保護されたセッターを持たせたいという問題がありましたが、次のようにして解決したと思いました。

public class Accessor : AccessorBase
{
    private Connection _connection;

    protected void setConnection(Connection value)
    {
        _connection = value;
    }

    internal Connection GetConnection()
    {
        return _connection;
    }
    ...
}

ただし、現在このエラーが発生しています。

一貫性のないアクセシビリティ: パラメータ タイプ 'Connection' は、メソッド 'setConnection(Connection)' よりもアクセスしにくい

これは私が持っているからinternal class Connectionです。パブリックにする必要Connectionがある一方で、パブリック クラスを作成したくないので、内部ゲッターと保護されたセッターを維持しながら、このエラーを回避するにはどうすればよいですか?Accessor

4

7 に答える 7

10

残念ながら、C#は「内部および保護」アクセス修飾子をサポートしていません(「内部または保護」のみがサポートされています)。つまり、protectedメンバーはアセンブリの外部に表示され、内部タイプを使用できません。の代わりに
使用するのが最も論理的な解決策です。internalprotected

そして、いつかC#に追加されるように、MicrosoftConnectに投票することもできます。

更新:C#7.2以降、これに使用できますprivate protected

于 2010-01-07T19:14:49.010 に答える
5

IConnection内部Connectionオブジェクトが実装するパブリックインターフェイスを作成します。の代わりにGetConnectionSetConnectionメソッドを受け入れて返すようにします。IConnectionConnection

基本的なSOLIDの原則が再び勝ちます。

于 2010-01-07T19:26:16.337 に答える
2

...保護されたメンバーはアセンブリの外部に表示され、内部型を使用できません。

-- Pent Ploompuu の回答

これを回避する 1 つの方法は、Connectionすべてのインスタンス メソッドとコンストラクターを内部にしながら公開することです。

于 2010-01-07T19:32:03.687 に答える
1

クラスConnectionが内部の場合、Accessorを派生させるクラスは、Connectionにアクセスできないため、保護されたsetConnectionを呼び出すことができません。

setConnectionを保護する場合は、Connectionをパブリックにする必要があります。

于 2010-01-07T19:14:09.447 に答える
0

申し訳ありませんが、その正確な設定が必要な場合は、Connectionクラスを公開する必要があります。

于 2010-01-07T19:17:20.017 に答える
0

残念ながら、それはできません。は内部であるため、Connection別のアセンブリのAccessorから派生したクラスはConnection、セッターにprotected internal何も解決しないとしてマークを付けても、表示できません。

あなたの唯一の望みは、クラスConnectionを公開することです。

于 2010-01-07T19:23:05.780 に答える
0

Coincoin は正しいですAccessor誰でもそこから派生できるパブリック クラスです。これは、別のアセンブリからも派生することを意味します。その派生クラスには、(別のアセンブリからの) 内部クラスを渡す必要がある保護されたメソッドが含まれています。これは決してうまくいきません。

Accessor内部または公開するか、 Randolphosの回答Connectionに従う必要があります

これが問題のコード例です

アセンブリ 1

//this class is only visible in Assembly 1
internal class Connection
{

}
public class Accessor
{
   protected void SetConnection(Connection con) { }
}

アセンブリ 2 - アセンブリ 1 への参照があります

//possible because Accessor is public
DerivedAccessor : Accessor
{
   void SomeMethod()
    {
        this.SetConnection(????) // you can't pass Connection, its not visible to Assembly2 
    }
}
于 2010-01-07T19:28:43.837 に答える