Вы, конечно, не можете перегружать операторы методами расширения. Причина, по которой он не работает для метода Equals
, заключается в том, что если любой метод применим без использования методов расширения, этот метод будет выбран до того, как методы расширения будут даже рассмотрены.
Несмотря на то, что ваш метод Equals
«лучше» с точки зрения преобразования типов аргументов в формальные типы параметров, компилятор всегда предпочитает «нормальные» методы. Вам придется дать другому методу другое имя.
Однако вы всегда можете использовать метод Enumerable.SequenceEquals
. Я не верю, что это приводит к короткому замыканию проверки длины (хотя это возможно для ICollection<T>
реализаций). Вы всегда можете реализовать более эффективную версию самостоятельно. В самом деле, если вы просто измените существующую реализацию массива на имя SequenceEquals
или даже ArrayEquals
, это будет хорошо:
public static bool ArrayEquals(this byte[] array, byte[] bytes)
{
// I'd personally use braces in all of this, but it's your call
if (array.Length != bytes.Length) return false;
for (int i = 0; i < array.Length; i++)
if (array[i] != bytes[i]) return false;
return true;
}
Обратите внимание, что было бы неплохо сделать его универсальным, но это, безусловно, стоило бы немного производительности, поскольку сравнение не могло бы быть встроено:
public static bool ArrayEquals<T>(this T[] first, T[] second)
{
// Reference equality and nullity checks for safety and efficiency
if (first == second)
{
return true;
}
if (first == null || second == null)
{
return false;
}
if (first.Length != second.Length)
{
return false;
}
EqualityComparer<T> comparer = EqualityComparer<T>.Default;
for (int i = 0; i < first.Length; i++)
{
if (!comparer.Equals(first[i], second[i]))
{
return false;
}
}
return true;
}