0

構造体を使用した継承でジェネリックを使用しようとしています。参照してください。

  public class AuditLogEntry : ObjectBase<AuditLogEntry.AuditLogEntryStruct>
    {

        private struct AuditLogEntryStruct
        {
            public int AuditID;
        }
}

 public abstract class ObjectBase<T> 
{
}

次のエラーがスローされるため、構造体にプライベートを使用できません: Inconsistent accessibility: base class 'ObjectBaseAuditLogEntry.AuditLogEntryStruct>' is lessaccessible than class 'AuditLogEntry'.

ただし、構造体を公開したくありません。何か案は?ありがとう、アレックス

質問の続き:

これが私たちがやろうとしていることです:

class AuditLogEntry : ObjectBase<AuditLogEntry.AuditLogEntryStruct>
{
  internal struct AuditLogEntryStruct
        {
            public int AuditID;
}

  public int AuditID
        {
            get
            {
                return udtObject.AuditID;
            }
set{
BeginEdit();
 udtObject.AuditID = value;
        }

}

 class ObjectBase<T>
{
  protected T udtObject;
        protected T udtPreEditObject;

  protected  void BeginEdit()
        {
            if (!IsDirty)
            {
                IsDirty = true;
                udtPreEditObject = udtObject;
            }
        }
}

AuditLogEntryStruct を公開する中でこれを達成する方法がわかりませんか? ありがとう、アレックス

4

2 に答える 2

2

1 つ以上の型引数がパブリックでない場合、ジェネリック クラスからパブリック クラスを派生させることはできません。

任意の型の派生元の型は、派生クラスと同じようにアクセス可能である必要があり、基本クラスへの型引数として指定された型パラメーターを含みます。

あなたが持っている場合

public class publicClass{}

ただし、A を次のように変更した場合、どのクラスも A から派生できます。

internal class internalClass{}

他の内部クラスのみが派生できます。

いずれかの型を型パラメーターとして渡した場合も同様です。以下の最初の 3 つは有効ですが、4 番目は有効ではありません

public class A : List<publicClass>{}
internal class B : List<internalClass>{}
internal class C : List<publicClass>{}

//not valid because D has wider accessibility than the close generic type List<internalClass>
public class D : List<internalClass>{}

EDIT 言語チームは、ある時点で、宣言を無効にするか、アクセスできない型への不正なアクセスを無効にする型を使用するかを決定する必要がありました。あなたの場合、あなたのクラス以外にはアクセスできない型を返すいくつかのメソッドと、他のクラスが提供できない型の引数を取るいくつかのメソッドがあります。したがって、クラスのオブジェクトを実際に使用できる唯一のオブジェクトは、クラスのオブジェクトになります。継承ではなく構成で解決できます

public class AuditLogEntry
{
        private ObjectBase<AuditLogEntry.AuditLogEntryStruct> _entry;
        private struct AuditLogEntryStruct
        {
            public int AuditID;
        }
}

public abstract class ObjectBase<T> 
{
}
于 2012-04-19T12:54:36.960 に答える
0

次の例を検討してください。

public class Foo : List<Bar>
{
    private struct Bar { }
}


var myFoo = new Foo();
...
var x = myFoo()[0]; // expression on the right side is of type Bar, yet Bar is inaccessible

アップデート

あなたが達成しようとしていることは、実際にはジェネリックを必要としません。オブジェクトであるかのように、内部の構造体にのみアクセスしますObjectBase<T>objectそれらをジェネリック型に変更して、完全に削除することもできます。

AuditLogEntryStructからアクセスできるようにするために何らかの機能を必要とするロジックがさらにある場合ObjectBase<T>は、インターフェイスを抽出できます。

public interface IStructsWithSomeFunctionality { ...  }

構造体にそれを実装させ、それを型パラメーターとして使用します

public class AuditLogEntry : ObjectBase<IStructsWithSomeFunctionality> { ... }
于 2012-04-19T13:01:22.497 に答える