[英]C# Casting object with inner generic
我正在嘗試將具有泛型的具體類轉換為其接口並獲取錯誤。 我不確定我錯過了什么。 我需要讓他們進入普通類型。
無法將“HierarchalLocationFilterSet”類型的對象強制轉換為“ImAFilterSet`1 [ModelBase]”。
一切都在編譯和運行,我似乎無法做下面的事情。
ImAFilterSet<IModelBase> c = new HierarchalLocationFilterSet()
我可以走到一半
var thisWorks = c as FilterSetBase<LocationModel>;
var thisAlsoWorks = c as ImAFilterSet<LocationModel>;
//This is a hard fail
var x = ((ImAFilterSet<ModelBase>) c );
var y = ((ImAFilterSet<IModelBase>) c );
特定
public interface ImAFilterSet<C> where C : IModelBase
{
List<C> Children { get; set; }
}
public abstract class FilterSetBase<C> : ImAFilterSet<C> where C : IModelBase
public class HierarchalLocationFilterSet : FilterSetBase<LocationModel>
public class LocationModel : ModelBase
public abstract class ModelBase : IModelBase
謝謝!
默認情況下,.NET中的泛型類/接口是不變的。 這就是你的代碼失敗的原因。
要將FilterSetBase<T1>
為ImAFilterSet<T2>
T1
必須與T2
相同。 T1
繼承T2
是不夠的。
您可以通過更改FilterSetBase<C>
聲明來解決此問題:
public abstract class FilterSetBase<C> : ImAFilterSet<IModelBase>
where C : IModelBase { }
或者你可以使ImAFilterSet
協變:
public interface ImAFilterSet<out C>
where C : IModelBase { }
只有當您的接口沒有聲明任何類型為C
參數的方法/屬性時,才有可能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.