如何在泛型的 where 子句中指定泛型类
本文关键字:泛型类 子句 where 泛型 | 更新日期: 2023-09-27 18:31:35
我有以下类和方法:
public class MyGenericClass<T>
where T : class
{
}
public class MyClass
{
public TGen MyMethod<TGen>(TGen myGenClass)
where TGen : MyGenericClass<T>
where T : class
{
return myGenClass;
}
}
但是,这会产生错误,因为它无法解析 MyMethod 中的符号T
。我宁愿不必有MyMethod<TGen, T>
,因为这对我来说似乎有点多余。这可能吗?
必须先指定T
,然后才能在定义中使用它。编译器无法知道T
是什么。
因此,您应该在使用之前指定T
(在方法级别,如下所示,或者在类级别使用 MyClass
):
public class MyClass
{
public TGen MyMethod<TGen, T>(TGen myGenClass)
where TGen : MyGenericClass<T>
where T : class
{
return myGenClass;
}
}
您还可以在 where 子句中使用泛型类型的具体实现:
public class MyClass
{
public TGen MyMethod<TGen>(TGen myGenClass)
where TGen : MyGenericClass<DateTime>
{
return myGenClass;
}
}
如果您希望能够对TGen
类型使用任何MyGenericClass
实现,则需要创建要使用的MyGenericClass
实现的基类(当然,这限制了您将为TGen
实例获得的功能。
public class MyGenericClassBase { }
public class MyGenericClass<T> : MyGenericClassBase { }
public class MyClass<TGen>
where TGen: MyGenericClassBase
{
// Stuff
}
听起来你只是忘记在该方法的泛型类型列表中包含T
:
public TGen MyMethod<TGen, T>(TGen myGenClass)
where TGen : MyGenericClass<T>
where T : class
{
return myGenClass;
}