具有内部泛型的 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
时才有可能。
我正在尝试将带有泛型的具体 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
时才有可能。