Преобразование двойного массива в массив IComparable
-
03-07-2019 - |
Вопрос
Я пытаюсь создать базовый класс Quicksort с помощью VB.NET, взяв для него массив элементов IComparable.Подпись выглядит так:
public shared sub Sort(ByVal values() as IComparable)
Однако когда я передаю массив двойных чисел, компилятор выдает мне ошибки.
Dim numbers(100) as double
Dim random as new Random(0)
for i as integer = 0 to numbers.length - 1
numbers(i) = random.NextDouble()
Next
QuickSort.Sort(numbers) ' gives compiler error.
Ошибка:
Error 88 Value of type '1-dimensional array of Double' cannot be converted to '1-dimensional array of System.IComparable' because 'Double' is not derived from 'System.IComparable'. C:\Proving Grounds\Module1.vb
В документации .NET указано, что double реализует IComparable.Почему компилятор .NET не позволяет мне это сделать?
Решение
Хотя double
можно привести к IComparable
, это не значит, что double[]
можно привести к IComparable[]
.Простым вариантом было бы создать новый IComparable[]
массив и скопируйте данные - или, в вашем случае, просто запустите исходный массив как IComparable[]
.
На самом деле, у меня возникнет соблазн использовать общий IComparable<T>
или IComparer<T>
интерфейсы или Comparison<T>
делегат – все с использованием дженериков – это также позволяет использовать Comparer<T>.Default
и компараторы не по умолчанию.