如何在泛型的 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>,因为这对我来说似乎有点多余。这可能吗?

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

必须先指定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;
}