簡體   English   中英

C#使用內部泛型的Casting對象

[英]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.

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