2012-05-01 38 views
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>的列表,实际上工作,因为隐式的upcasts在泛型中不起作用。由于我真正想要的是财产id,我当然可以在MyList<T, E>中明确实施财产或方法,并返回一个包含此信息的新集合。

我更愿意做的是让它隐式完成。有没有一种方法(可能是一个隐式操作符,或者在MyList<T, E>中实现的其他接口)来实现它?

回答

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); 

IReadOnlyList<T> Interface

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