Перегрузка оператора - почему статическое разрешение? - PullRequest
2 голосов
/ 16 декабря 2011

Каковы причины статического разрешения перегруженных операторов?Мне кажется странным выбор - единственное преимущество, которое я могу придумать, - это небольшое увеличение производительности (но иногда JIT может этого избежать) ценой некоторого довольно неинтуитивного поведения - т.е.виртуальная функция для получения желаемого поведения.

Это просто перенято из C ++ или есть другие веские причины для этого?

Ответы [ 3 ]

2 голосов
/ 16 декабря 2011

У меня в голове две вещи, и одной из них ИМХО достаточно, чтобы разорвать сделку самому:

  1. Какие операторы? Бинарные операторыиметь два операнда, и динамическая диспетчеризация, основанная на типах двух аргументов, недоступна!«Классические» virtual методы отправляются на основе только типа времени выполнения this.
  2. Какой вариант использования оправдывает дополнительную сложность?
2 голосов
/ 16 декабря 2011

См. Статью Эрика Липперта Почему перегруженные операторы всегда статичны в C #?

Скорее, вопрос, который мы должны задать себе, сталкиваясь с потенциальной языковой функцией, заключается в следующем: «Оправдывает ли неоспоримая выгода этой функции все затраты? И затраты значительно больше, чем просто долларовые затраты на проектирование, разработку, тестирование, документирование и поддержку функции. Существуют более тонкие затраты, например, не затруднит ли эта функция изменение алгоритма вывода типа в будущем? Приводит ли это нас в мир, где мы не сможем вносить изменения, не введя разрывы обратной совместимости? И так далее.

В этом конкретном случае неоспоримое преимущество невелико. Если вы хотите иметь перегруженный виртуальный оператор в C #, вы можете легко создать его из статических частей. [...]

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

2 голосов
/ 16 декабря 2011

Рассмотрим случай перегрузки оператора для ссылочного типа.Это может быть null по обе стороны от оператора.

Если бы операторы были методами экземпляра, они бы не работали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...