如何在泛型的where子句中指定泛型类?

时间:2012-04-19 16:00:48

标签: c# generics c#-4.0

我有以下类和方法:

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>因为它对我来说似乎有点多余。这可能吗?

3 个答案:

答案 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;
}