2012-05-01 125 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; } 
}