Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Отсутствие поддержки ограничений при использовании операций

Отсутствие поддержки ограничений при использовании операций

При создании обобщенных методов для вас может оказаться сюрпризом появление ошибок компилятора, когда с параметрами типа используются операции C# (+, -, *, == и т.д.). Например, я уверен, вы сочли бы полезными классы Add(), Subtract(), Multiply() и Divide(), способные работать с обобщенными типами.

// Ошибка компиляции!
// Нельзя применять операции к параметрам типа!
public class BasicMath‹T› {
 public T Add(T arg1, T arg2) { return arg1 + arg2; }
 public T Subtract(T arg1, T arg2) { return arg1 – arg2; }
 public T Multiply(T arg1, T arg2) { return arg1 * arg2; }
 public T Divide(T arg1, T arg2) { return arg1 / arg2; }
}

Как ни печально, этот класс BasicMath‹T› не компилируется. Это может показаться большим ограничением, но не следует забывать, что обобщения являются обобщениями. Конечно, тип System.Int32 может прекрасно работать с бинарными операциями C#. Однако, если, например, ‹T› будет пользовательским классом иди типом структуры, компилятор не сможет сделать никаких предположений о характере перегруженных операций +, -, * и /. В идеале C# должен был бы позволять обобщенному типу ограничения с использованием операций, например, так.

// Только для иллюстрации!
// Этот программный код не является допустимым в C# 2.0.
public class BasicMath‹T› where T: operator +, operator -, operator *, operator / {
 public T Add(T arg1, T arg2) { return arg1 + arg2; }
 public T Subtract(T arg1, T arg2) { return arg1 – arg2; }
 public T Multiply(T arg1, T arg2) { return arg1 * arg2; }
  public T Divide(T arg1, T arg2) { return arg1 / arg2; }
}

Увы, ограничения обобщенных типов при использовании операций в C# 2005 не поддерживаются.

Исходный код. Проект CustomGenericCollection размещен в подкаталоге, соответствующем главе 10.

Оглавление книги


Генерация: 1.231. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз