[英]c# casting to and from interface types with generic types
我有實現接口IRepository
MockRepository
類,並且有實現接口IIdentifiable
Technology
類。
我想將對象從MockRepository<Technology>
投射到IRepository<IIdentifiable>
並在某些操作完成后再次投射。 這可能嗎? 我的代碼可以編譯,但是當我嘗試運行它時,我得到了無效的強制轉換異常。
簡短的答案是沒有。
如果您有接口IMyInterface<T>
則編譯器將為您使用的每種T類型創建一個新接口,並替換所有T值。
舉個例子:
我有一個界面:
public interface IMyInterface<T> {
public T Value {get; set;}
}
我有2節課:
public class Foo {}
public class Bar : Foo {}
然后定義以下內容
public class Orange : IMyInterface<Foo> {}
public class Banana : IMyInterface<Bar> {}
編譯器將使用特定的名稱約定自動創建2個新接口,我將使用不同的名稱來強調它們的不同
public interface RandomInterface {
Foo Value { get; set; }
}
public interface AlternativeInterface {
Bar Value { get; set; }
}
public class Orange : RandomInterface {
}
public class Banana : AlternativeInterface {
}
如您所見, RandomInterface
和AlternativeInterface
之間沒有關系。 因此,不能將繼承自RandomInterface
的類RandomInterface
為AlternativeInterface
閱讀問題評論后更新
如果希望將MockRepository傳遞給需要IRepository的函數,則可以執行以下操作
public void MyFunction<T>(IRepository<T> repo) where T: IIdentifiable {
}
我認為你有:
class MockRepository<T> : IRepository<T> // note: same T
{
}
interface IRepository<out X> // note: "out" means covariance in X
{
}
然后,因為Technology
是可以IIdentifiable
,所以協方差可以得出IRepository<Technology>
也是IRepository<IIdentifiable>
。
因此,如果您的IRepository<>
接口是(或可以使)協變的,它應該可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.