簡體   English   中英

C#與泛型類型的接口類型之間的強制轉換

[英]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 {
}

如您所見, RandomInterfaceAlternativeInterface之間沒有關系。 因此,不能將繼承自RandomInterface的類RandomInterfaceAlternativeInterface

閱讀問題評論后更新

如果希望將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM