我知道如何强制类型参数成为另一种类型的子类型:
public interface IMapping<T2>
{
public void Serialize<T3>(T3 obj)
where T3 : T2;
}
...
var mapping = MapManager.Find<Truck>();
mapping.Serialize(new TonkaTruck());
有没有办法强制类型参数成为另一种类型的超类型?
public interface IMapping<T2>
{
public void IncludeMappingOf<T1>()
where T2 : T1; // <== doesn't work
}
...
var mapping = MapManager.Find<Truck>();
// Truck inherits Vehicle
// Would like compiler safety here:
mapping.IncludeMappingOf<Vehicle>();
mapping.Serialize(new TonkaTruck());
目前,我必须在运行时使用IsSubclassOf
inside比较 T1 和 T2 IncludeMappingOf
。编译安全的解决方案会更好。有任何想法吗?
编辑: 将示例更改为减少设计气味。
注意:链接的问题非常相似,但没有给出合适的答案。希望这个问题也能对这个问题有所启发。
编辑#2:
更简单的例子:
public class Holder<T2>
{
public T2 Data { get; set; }
public void AddDataTo<T1>(ICollection<T1> coll)
//where T2 : T1 // <== doesn't work
{
coll.Add(Data); // error
}
}
...
var holder = new Holder<Truck> { Data = new TonkaTruck() };
var list = new List<Vehicle>();
holder.AddDataTo(list);
编译器:参数类型“T2”不可分配给参数类型“T1”。 是的,我知道,我试图让编译器只允许 T2 可分配给参数类型 T1 的情况!