c#变量声明的通用,这可能吗?

时间:2013-07-20 02:17:36

标签: c# generics

我有以下问题:

public class MyClass<T> where T : class
{
    private MyOtherClass<T, U> variable where U : class;
    ... content ...
}
public class MyOtherClass<T, U> where T : class where U : class
{
    ... content ...
}

这有可能吗?

3 个答案:

答案 0 :(得分:3)

如果要根据某些类型参数MyClass设置U泛型的字段或属性的类型,则必须将其声明为MyClass的类型参数:< / p>

public class MyClass<T, U> 
    where T : class 
    where U : class
{
    private MyOtherClass<T, U> variable;
    ... content ...
}
public class MyOtherClass<T, U>
    where T : class 
    where U : class
{
    ... content ...
}

但是,这不适用于方法。这非常好:

public class MyClass<T> 
    where T : class 
{
    private MyOtherClass<T, U> Method<U>() where U : class
    {
        ... content ...
    }
}

答案 1 :(得分:1)

您希望MyClass<T>包含对MyOtherClass<T, U>的引用,其中T匹配,但接受任何U。如果您正在尝试这样做,现有答案可能无济于事,因为具有通用U参数的方法仍然需要用户指定U

具有类型参数的类(尤其是多个类)应该继承/实现 less 泛型,以支持这样的情况。例如:

public interface IOtherThing<T> {
    T Value1 { get; }
    object Value2 { get; }
}

public class MyOtherClass<T, U> : IOtherThing<T> {
    public T Value1 { get { ... } }
    public U Value2 { get { ... } }
    object IOtherThing<T>.Value2 { get { return Value2; } }
}

现在,MyClass<T>可以将变量声明为IOtherThing<T>,可以将其分配给任何MyOtherClass<T, U>

答案 2 :(得分:0)

要直接回答问题的标题,您不能这样做,因为variableMyOtherClass<T, U>类型的字段,这意味着MyOtherClass 定义类型参数TU - 就像你拥有它一样!

T的{​​{1}}与MyClass<T>的{​​{1}}不同,因为通用类型约束的声明 属于泛型类型本身,而不属于使用它的类型 - 这很好!

如果可能的话,就是这样的类型:

T

可能像这样使用:

MyOtherClass<T, U>

接口,类和方法可以是通用的(即能够定义类型约束);字段和属性不能,但它们可以是泛型类型。