2009-03-06 3 views

ответ

0

Вы не можете перегружать операторы для существующих типов, поскольку это может потенциально повредить любой другой код, который использует типы.

Вы можете создать свой собственный класс, который инкапсулирует массив, выставлять методы и свойства, которые вам нужны из массива, и перегружать любые операторы, которые имеют смысл.

Пример:

public class AddableArray<T> : IEnumerable<T> { 

    private T[] _array; 

    public AddableArray(int len) { 
     _array = new T[len]; 
    } 

    public AddableArray(params T[] values) : this((IEnumerable<T>)values) {} 

    public AddableArray(IEnumerable<T> values) { 
     int len; 
     if (values is ICollection<T>) { 
      len = ((ICollection<T>)values).Count; 
     } else { 
      len = values.Count(); 
     } 
     _array = new T[len]; 
     int pos = 0; 
     foreach (T value in values) { 
      _array[pos] = value; 
      pos++; 
     } 
    } 

    public int Length { get { return _array.Length; } } 

    public T this[int index] { 
     get { return _array[index]; } 
     set { _array[index] = value; } 
    } 

    public static AddableArray<T> operator +(AddableArray<T> a1, AddableArray<T> a2) { 
     int len1 = a1.Length; 
     int len2 = a2.Length; 
     AddableArray<T> result = new AddableArray<T>(len1 + len2); 
     for (int i = 0; i < len1; i++) { 
      result[i] = a1[i]; 
     } 
     for (int i = 0; i < len2; i++) { 
      result[len1 + i] = a2[i]; 
     } 
     return result; 
    } 

    public IEnumerator<T> GetEnumerator() { 
     foreach (T value in _array) { 
      yield return value; 
     } 
    } 

    IEnumerator System.Collections.IEnumerable.GetEnumerator() { 
     return _array.GetEnumerator(); 
    } 

} 

Использование:

// create two arrays 
AddableArray<int> a1 = new AddableArray<int>(1, 2, 3); 
AddableArray<int> a2 = new AddableArray<int>(4, 5, 6); 

// add them 
AddableArray<int> result = a1 + a2; 

// display the result 
Console.WriteLine(string.Join(", ", result.Select(n=>n.ToString()).ToArray())); 

(Обратите внимание, что, как класс реализует IEnumerable<T>, вы можете использовать методы расширения, как Select на нем.)

+0

Это код очень просто, так что a1 + a2 = унифицированный массив. Почему бы просто не сделать a1.Union (a2) .ToArray() – Keith

+0

Да, это намного проще, но это не так эффективно. Это довольно хорошо, хотя, быстрый тест показывает, что он занимает примерно 2-4 раза дольше. – Guffa

4

В принципе, вы не можете.

Вы можете использовать методы расширения для добавления функциональности, как это:

public void CustomAdd(this Array input, Array addTo) { 
    ... 
} 

Но это не работает с операторами.

+0

Не следует использовать оператор перегрузка по встроенным типам или методам расширения? – Lennie

+0

Да - даже если бы вы могли это сделать, это привело бы к очень запутанному коду: «Почему этот массив не работает, как обычно?» – Keith

1

Вы не можете :)

Вы можете, однако, для примера массива наследуют от IEnnumerable или списка ... и переопределить эти операторы.

1

Короткий ответ: вы не можете, поскольку указали @Keith.

Более длинный ответ заключается в том, что для того, чтобы добавить оператор перегрузку в класс, вы должны иметь возможность изменить исходный код для этого класса.

В случае, когда оператор добавлен для обработки комбинации двух разных типов (например, массив + строка), достаточно, чтобы вы могли изменить исходный код для одного из этих типов. Это означает, что вы должны иметь возможность добавлять код, чтобы указать, что произойдет, если вы добавите один из своих типов в массив.

В случае классов BCL вам пока не повезло.

Смежные вопросы