我的类型层次结构定义如下:
interface IMyClass
{
}
interface IBase1<T>
{
}
interface IBase2<T>
{
}
interface IMyDerived1 : IBase1<IMyClass>
{
}
class Base1<T, U> : IBase1<T>
where U : IBase2<T>
{
}
class Base2<T, U> : IBase2<T>
where U : IBase1<T>
{
}
class Derived1<T, U> : Base1<T, U>, IMyDerived1
where T : IMyClass
where U : IBase2<T>
{
}
class Derived2<T, U> : Base2<T, U*>
where T : IMyClass
where U : IMyDerived1
{
}
但Visual Studio 2008(.net 3.5 SP1)表示Derived2的父指定符中的参数U(标有*)不能转换为IBase1<T>
。这可以解决吗?
修改
它确实看起来像泛型过度使用但允许Base1,2和Derived1,2在没有强制转换的情况下对提供的类型应用操作。像这样:
class MyClass : IMyClass
{}
class MySpecific1 : Derived1<MyClass, MySpecific2>
{
// use inherited properties and methods of type MyClass here
// use properties of MySpecific2 returning MyClass without casts
}
class MySpecific2 : Derived2<MyClass, MySpecific1>
{
// use inherited properties and methods of type MyClass here
// use properties of MySpecific1 returning MyClass without casts
}
对于.net4中的差异,可能会更优雅地解决这个问题,但我现在仍然坚持使用3.5。
答案 0 :(得分:3)
class Derived2<T, U>: Base2<T, U>
where T: IMyClass
where U: IMyDerived1, IBase1<T>
{
}
答案 1 :(得分:1)
这伤害了我的头脑!
看一下,问题在于这个定义:
interface IMyDerived1 : IBase1<IMyClass>
{
}
您已经专门使用该泛型实现,然后尝试使用泛型参数:
class Derived2<T, U> : Base2<T, U>
where T : IMyClass
where U : IMyDerived1
{
}
哪个无效。不确定这是否正确,但您可以进行此更改:
interface IMyDerived1<T> : IBase1<T>
{
}
class Derived2<T, U> : Base2<T, U>
where T : IMyClass
where U : IMyDerived1<T>
{
}
你在那里设计的是一个复杂的层次结构,它的用途是什么?
答案 2 :(得分:0)
问题是,在Derived2中,T不是IMyClass,它可能是实现此接口的其他类。在Base1中,它被指定为完全IMyClass。具有不同泛型参数的类型在C#3.0中不兼容。
对我来说,这看起来有点像普通的过度使用。但我无法看到背景。