2

次のクラスがあるとします。

public abstract class MyRecordClass
{
    public int id { get; private set; }
}

public class ExampleMyRecordClass : MyRecordClass {}

public enum SomeIntEnum : int {}

public class MyList<T, E> : IList<T>
where T : MyRecordClass
{

}

public class MyOtherClass
{
    public void MyMethod(MyList<T, E> list) {}
}

、次のようにメソッドを呼び出したいと思います:

MyList<ExampleMyRecordClass, SomeIntEnum> myList;
MyOtherClass myOtherClass;

myOtherClass.MyMethod(myList);

MyList<ExampleMyRecordClass, SomeIntEnum>ただし、暗黙的なアップキャストはジェネリック型では機能しないため、 type のリストを渡す場合、これは実際には機能しません。本当に必要なのは propertyだけなので、もちろん、この情報を含む新しいコレクションを返すidプロパティまたはメソッドを明示的に実装できます。MyList<T, E>

私がやりたいのは、これを暗黙的に行うことです。これを可能にする方法 (おそらく暗黙の演算子、または に実装する追加のインターフェイスMyList<T, E>) はありますか?

4

1 に答える 1

7

正確に何を探しているのかわかりませんが、次の変更を加えると、コンパイルして正常に実行されます。

public class MyOtherClass
{
    public void MyMethod<T, E>(MyList<T, E> list) where T : MyRecordClass { }
}

おそらく共分散を探していますか?

public class MyList<T, E> : IList<T>, IReadOnlyList<T>
    where T : MyRecordClass
{
}

public class MyOtherClass
{
    public void MyMethod(IReadOnlyList<MyRecordClass> list) { }
}

使用法:

MyList<ExampleMyRecordClass, SomeIntEnum> myList;
MyOtherClass myOtherClass;

myOtherClass.MyMethod(myList);

IReadOnlyList<T> インターフェイス:

public interface IReadOnlyList<out T> : IEnumerable<T>
{
    int Count { get; }
    T this[int index] { get; }
}
于 2012-05-01T15:55:02.217 に答える