我有以下类和方法:
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>
因为它对我来说似乎有点多余。这可能吗?
答案 0 :(得分:3)
您必须先指定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;
}
}
答案 1 :(得分:2)
如果您希望能够为MyGenericClass
类型使用任何 TGen
实现,那么您需要创建MyGenericClass
的基类要使用的实现(当然,这会限制您为TGen
实例获得的功能。
public class MyGenericClassBase { }
public class MyGenericClass<T> : MyGenericClassBase { }
public class MyClass<TGen>
where TGen: MyGenericClassBase
{
// Stuff
}
答案 2 :(得分:1)
听起来你只是忘记在方法的泛型类型列表中包含T
:
public TGen MyMethod<TGen, T>(TGen myGenClass)
where TGen : MyGenericClass<T>
where T : class
{
return myGenClass;
}