C#使用内部泛型的Casting对象

时间:2015-03-15 00:39:04

标签: c# generics casting

我正在尝试将具有泛型的具体类转换为其接口并出现错误。我不确定我错过了什么。我需要让他们进入普通类型。

  

无法将'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

谢谢!

1 个答案:

答案 0 :(得分:3)

默认情况下,.NET中的通用类/接口是不变的。这就是你的代码失败的原因。

FilterSetBase<T1>投射到ImAFilterSet<T2> T1必须是T2T1继承T2是不够的。

您可以通过更改FilterSetBase<C>的声明来解决这个问题:

public abstract class FilterSetBase<C> : ImAFilterSet<IModelBase>
    where C : IModelBase { }

或者您可以ImAFilterSet协变:

public interface ImAFilterSet<out C>
    where C : IModelBase { }

只有在您的界面没有声明任何类型为C的参数的方法/属性时,才有可能。