gpt4 book ai didi

从实现 IComparable 的东西继承时,C# BinarySearch 中断了吗?

转载 作者:太空狗 更新时间:2023-10-29 22:55:47 24 4
gpt4 key购买 nike

在 .NET 中,如果您尝试搜索的项目继承自 IComparable 而不是直接实现它,则 BinarySearch 算法(在列表、数组等中)似乎会失败:

List<B> foo = new List<B>(); // B inherits from A, which implements IComparable<A>
foo.Add(new B());
foo.BinarySearch(new B()); // InvalidOperationException, "Failed to compare two elements in the array."

地点:

public abstract class A : IComparable<A>
{
public int x;

public int CompareTo(A other)
{
return x.CompareTo(other.x);
}
}

public class B : A {}

有解决办法吗?在 B 类中实现 CompareTo(B other) 似乎不起作用。

最佳答案

文档说得很清楚:

checks whether type T implements the IComparable generic interface and uses that implementation, if available. If not, Comparer.Default checks whether type T implements the IComparable interface. If type T does not implement either interface, Comparer.Default throws an InvalidOperationException.

因此,一个简单的解决方案是实现非通用接口(interface) IComparable .
添加CompareTo(B other) 为你工作,只要你也实现IComparable<B> - 你可能忘记了这一点。

一个有趣的解决方案是使用 C# 4 编译代码,它运行时没有任何错误。 C# 4 引入了通用协方差:public interface IComparable<in T>对比public interface IComparable<T> ,并且发布的代码按预期工作。

关于从实现 IComparable<T> 的东西继承时,C# BinarySearch 中断了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2752478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com