将泛型类型隐式强制转换为非泛型等效项
本文关键字:泛型 转换 泛型类型 | 更新日期: 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; }
}