鉴于以下类别:
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>
中实现的另一个接口)来实现这一点?
答案 0 :(得分:7)
我不确定你究竟在寻找什么,但是如果你进行了以下更改,它会编译并运行得很好:
public class MyOtherClass
{
public void MyMethod<T, E>(MyList<T, E> list) where T : MyRecordClass { }
}
您是否正在寻找covariance?
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);
public interface IReadOnlyList<out T> : IEnumerable<T>
{
int Count { get; }
T this[int index] { get; }
}