我有以下问题:
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 ...
}
有什么办法可以实现这个吗?
如果你想要让 MyClass
类的一个字段或属性的类型基于一些类型参数 U
变成泛型,你需要将其声明为 MyClass
的一个类型参数:
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 ...
}
}
variable
是MyOtherClass<T, U>
类型的字段,这意味着MyOtherClass
定义了类型参数T
和U
- 就像你写的一样!MyClass<T>
中的T
与MyOtherClass<T, U>
中的T
不同,因为泛型类型约束的声明属于泛型类型本身,而不属于使用它的类型 - 这是好的!public class SomeRepository<TEntity>
where TEntity : IEntity { /* ... */}
可能会被用作如下所示:
public class SomeService
{
private SomeRepository<TEntity> _someRepo where TEntity : INotAnEntity
}
接口、类和方法可以是泛型的(即能够定义类型约束);字段和属性不能,但它们可以是泛型类型。
MyClass<T>
包含对MyOtherClass<T, U>
的引用,其中两个T
匹配但接受任何U
。如果这是你想做的,现有的答案可能不会有所帮助,因为具有通用U
参数的方法仍需要用户指定U
。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>
。
MyOtherClass
,T
在两种类型中具有相同的含义(它们甚至需要具有相同的类型约束才能编译)。 - Mathieu Guindon