进一步约束类类型参数的泛型方法

时间:2021-06-03 11:08:03

标签: c# generics

我有一个带有 BisectLeft 方法的数据结构

public class MyStruct<T> where T: IComparable<T>
{
    public T BisectLeft(T item) {...}
}

我想为泛型类型 BisectLeft 添加 U 的重载,其中 T: IComparable<U>

    public T BisectLeft(T item) {...}

    public T BisectLeft<U>(U item) where T: IComparable<U> {...}

这不会编译,因为它无法解析类型 T。我也不能将 T 添加为 BisectLeft<T, U>,因为 T 将被视为类 MyStruct<T> 的类型参数的重复项。

有没有办法在不添加 U 作为类的类型参数的情况下实现这一点?

1 个答案:

答案 0 :(得分:2)

您应该在父类型或方法中指定类型参数,如 where T。如果你在两个地方都定义它就行不通了。

在您的情况下,您应该只在方法中执行此操作,例如:

public class MyStruct
{
    public T BisectLeft<T>(T item)
        where T : IComparable<T>
    {
        return ...;
    }

    public T BisectLeft<T, U>(U item)
        where T : IComparable<U>
    {
        return ...;
    }
}