c# - 接口(interface)扩展方法,具有匹配的通用参数

标签 c# generics extension-methods

更新1

我意识到简单泛型的原始限制意味着我无法比较不同种类的对象,无论它们是否实现了 IComparable<T>。或不是,结果现在是最新的:

public static bool IsLessThan<TSource, TComparer>(this TSource source, TComparer comparer)
    where TSource : IComparable<TComparer>
    where TComparer : IComparable<TComparer>
{
    return source.CompareTo(comparer) < 0;
}

原创

我写了一个简单的 IsLessThan(IComparable comparer) IComparable 上的扩展方法界面。不过,我遇到了一个小问题;我已经意识到基本上它允许任何 IComparable进行比较,我宁愿没有。或者我想知道是否可以使用泛型来限制参数?目前我的扩展方法是这样的:

public static bool IsLessThan(this IComparable source, IComparable comparer) 
{
    return source.CompareTo(comparer) < 0;
}

有没有办法使用泛型来确保sourcecomparer是同一类型,同时仍保持 IComparable 的约束?

例子

int test = 2;
var resultOne = test.IsLessThan(3); // should return true
var resultTwo = test.IsLessThan("Hello world"); // shouldn't compile

最佳答案

好吧,你可以使用:

public static bool IsLessThan<T>(this T source, T comparer) where T : IComparable

或者您可以使用 IComparable<T> 使其更受约束:

public static bool IsLessThan<T>(this T source, T comparer)
    where T : IComparable<T>

后者在避免装箱方面也会更有效。

关于c# - 接口(interface)扩展方法,具有匹配的通用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12513833/

相关文章:

C# - 强制重写的方法由父级而不是实例调用

c# - 强类型数据表/数据集中的可空类型 - 解决方法?

c# - 具有内部实例化的空列表上的扩展方法

c# - ICollection/ICollection<T> 歧义问题

c# - 如何检测在 Visual Studio 中删除的断点?

c# - 如何更好地使用 KeyDown 事件验证?

c# - 如何以编程方式双向绑定(bind)模板字段中的文本框

Java - 从类型 A 的类对象获取类型 A 数组的类对象?

java - 如何获取 super 接口(interface)的参数化类型的实际类型?

Java 泛型 - 以泛型类型为键的映射