将泛型类型隐式强制转换为非泛型等效项

本文关键字:泛型 转换 泛型类型 | 更新日期: 2023-09-27 18:32:53

给定以下类:

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> 的列表,这实际上不起作用,因为隐式向上转换在泛型类型中不起作用。由于我真正想要的只是属性id,我当然可以在MyList<T, E>中显式实现一个属性或方法,以返回包含此信息的新集合。

我更愿意做的是隐式地完成此操作。有没有办法(也许是一个隐式运算符,或者一个额外的接口来实现MyList<T, E>)来实现这一点?

将泛型类型隐式强制转换为非泛型等效项

我不确定您到底在寻找什么,但是如果您进行以下更改,它可以编译并运行良好:

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 接口:

public interface IReadOnlyList<out T> : IEnumerable<T>
{
    int Count { get; }
    T this[int index] { get; }
}