Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 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.
- Имена индексов ограничений
- 4. Свойства унарных операций
- 3. Свойства бинарных операций
- 4. Варианты операций соединения
- 3.5 Проблемы доступа при использовании нескольких протоколов
- Не хочу, чтобы компьютером пользовались в мое отсутствие. Как установить пароль и блокировать машину?
- При неудачном выполнении некоторых операций Windows динамик издает пронзительный звук. Можно ли заставить его замолчать?
- Как можно узнать, когда в мое отсутствие включался компьютер, какие программы запускались и т. д.?
- Модуль поддержки NetBIOS через TCP
- 3.2. Определение горизонтальных и вертикальных ограничений на языке визуального форматирования
- Включение поддержки электронной почты для досок обсуждений
- 8.2.4. Включение в дистрибутив поддержки SATA-дисков