我有以下问题:
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 ...
}
这有可能吗?
答案 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)
要直接回答问题的标题,您不能这样做,因为variable
是MyOtherClass<T, U>
类型的字段,这意味着MyOtherClass
定义类型参数T
和U
- 就像你拥有它一样!
T
的{{1}}与MyClass<T>
的{{1}}不同,因为通用类型约束的声明 属于泛型类型本身,而不属于使用它的类型 - 这很好!
如果可能的话,就是这样的类型:
T
可能像这样使用:
MyOtherClass<T, U>
接口,类和方法可以是通用的(即能够定义类型约束);字段和属性不能,但它们可以是泛型类型。