运算符重载为内置类型

时间:2009-03-06 09:12:39

标签: c#

如何覆盖要在内置类型(如String,数组等)上使用的运算符?例如:我希望覆盖数组的+运算符的含义。

4 个答案:

答案 0 :(得分:4)

基本上你不能。

您可以使用扩展方法添加如下功能:

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

但这对运营商不起作用。

答案 1 :(得分:1)

你不能:)

但是,您可以从数组示例继承IEnnumerable或List ...并覆盖这些运算符。

答案 2 :(得分:1)

简短的回答是你不能像@Keith所指出的那样。

更长的答案是,为了将操作符重载添加到类中,您需要能够更改该类的源代码。

如果添加运算符来处理两种不同类型(例如数组+字符串)的组合,则可以更改其中一种类型的源代码。这意味着您应该能够添加代码来指定如果将自己的类型添加到数组中会发生什么。

就BCL课程而言,你运气不好。

答案 3 :(得分:1)

您不能为现有类型重载运算符,因为这可能会破坏使用这些类型的任何其他代码。

您可以创建自己的类来封装数组,从数组中公开所需的方法和属性,并重载任何有意义的运算符。

示例:

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等扩展方法。)