具有内部泛型的 C# 转换对象

C# Casting object with inner generic

我正在尝试将带有泛型的具体 class 投射到它的接口上,但出现错误。我不确定我错过了什么。我需要把它们变成普通类型。

Unable to cast object of type 'HierarchalLocationFilterSet' to type 'ImAFilterSet`1[ModelBase]'.

一切都编译并运行,我似乎无法做下面的事情。

ImAFilterSet<IModelBase> c = new HierarchalLocationFilterSet()

我能走一半就ok了

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

谢谢!

泛型 classes/interfaces 在 .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 { }

只有当您的界面未声明任何 methods/properties 且参数类型为 C 时才有可能。