public interface IArithmetic {
...
IArithmetic Add(IArithmetic a, IArithemetic b);
...
}
Перегрузка оператора в generic классе C#
class TVector<T>
{
public T[] mas;
}
Требуется переопределить для сего класса оператор, ну скажем, +, чтобы к каждому элементу массива прибавлял число.
Что-то вроде:
public static TVector<T> operator +(TVector<T> vec, T a);
при таком раскладе компилятор ругается, что мол не может он сложить Т с Т, ибо фиг его знает, может там какой-нить нескладываемый тип.
Если записать что-то типа того:
public static TVector<int> operator +(TVector<int> vec,int a);
он еррорит, типа один из параметров должен быть типа TVector<T> и опять же не компилится.
Проблема решается с помощью условия where на параметр Т, но как конкретно его записать?
А просто метод для прибавления элемента неудобно? Кстати, если унаследовать TVector от ArrayList, тогда можно использовать его методы, там были AddRange() и Add().
Наследовать ничего нельзя в моём случае...
Цитата: Check
Метод или не метод - неважно. Компилятор не будет складывать объекты, не зная, определен ли для них оператор +.
В C# не проходят такие вещи. Никаким способом нельзя указать, какие операторы поддерживает тот или иной объект на этапе компиляции. Введение же интерфейсов типа
Код:
блин, всё было бы элементарно, если бы можно было в интерфейс помещать операторы(
Цитата: Check
блин, всё было бы элементарно, если бы можно было в интерфейс помещать операторы(
Ммм под .NET есть и другие языки, в которых внедрение и перегрузка операторов поддерживается лучше, например в Nemerle можно вообще какие угодно операторы создавать и перегружать: <->, <-- и прочих подобных.
Понимаете, стоит задача переписать программу с С++ на С# для университетского курса. А тема лабы - "шаблонные классы". Так что у меня нет свободы выбора языка или средства( Шаг влево-вправо - расстрел за отход от темы...
Цитата: Check
А тема лабы - "шаблонные классы". Так что у меня нет свободы выбора языка или средства( Шаг влево-вправо - расстрел за отход от темы...
Некоторые возможности C++ не могут быть отражены в C#.
Это относится к произвольной перегрузке операторов.
Генерики C# это далеко не шаблоны. Это самодостаточные типы данных, так что подобный курс невозможно без серьезных изменений отобразить на С#.