将泛型类型隐式转换为非泛型等价物

Sör*_*lau 2 c# generics inheritance .net-2.0

鉴于以下课程:

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) {}
}
Run Code Online (Sandbox Code Playgroud)

,我想调用这样的方法:

MyList<ExampleMyRecordClass, SomeIntEnum> myList;
MyOtherClass myOtherClass;

myOtherClass.MyMethod(myList);
Run Code Online (Sandbox Code Playgroud)

但是,如果传递类型列表,这实际上不起作用MyList<ExampleMyRecordClass, SomeIntEnum>,因为隐式upcast在泛型类型中不起作用.因为我真正想要的只是属性id,所以我当然可以显式地实现一个属性或方法MyList<T, E>,返回一个包含这些信息的新集合.

我更喜欢做的是隐含地完成这项工作.是否有办法(可能是一个隐式运算符,或者实现的附加接口MyList<T, E>)来实现这一点?

dtb*_*dtb 7

我不确定你究竟在寻找什么,但如果你进行以下更改,它会编译并运行得很好:

public class MyOtherClass
{
    public void MyMethod<T, E>(MyList<T, E> list) where T : MyRecordClass { }
}
Run Code Online (Sandbox Code Playgroud)

您是否正在寻找协方差

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

public class MyOtherClass
{
    public void MyMethod(IReadOnlyList<MyRecordClass> list) { }
}
Run Code Online (Sandbox Code Playgroud)

用法:

MyList<ExampleMyRecordClass, SomeIntEnum> myList;
MyOtherClass myOtherClass;

myOtherClass.MyMethod(myList);
Run Code Online (Sandbox Code Playgroud)

IReadOnlyList <T>接口:

public interface IReadOnlyList<out T> : IEnumerable<T>
{
    int Count { get; }
    T this[int index] { get; }
}
Run Code Online (Sandbox Code Playgroud)