基于同一定义中的其他类型参数的泛型类型参数约束

时间:2010-06-30 13:42:04

标签: c# generics constraints

我的类型层次结构定义如下:

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。

3 个答案:

答案 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中不兼容。

对我来说,这看起来有点像普通的过度使用。但我无法看到背景。