首页 > 解决方案 > 进一步约束类类型参数的通用方法

问题描述

我有一个带有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> {...}

这不会编译,因为它无法解析 type T。我也不能添加TasBisectLeft<T, U>因为T会被认为是类的类型参数的副本MyStruct<T>

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

标签: c#generics

解决方案


您应该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 ...;
    }
}

推荐阅读