Почему C # / CLR не поддерживает переопределение метода co / противоречия? - PullRequest
13 голосов
/ 08 мая 2009

Существует довольно много вопросов и ответов о взломе вокруг ограничения C #, не позволяющего типам возврата метода (и аргументу) быть замененными на совместимые типы в переопределениях, но почему существует ли это ограничение, либо в компиляторе C # или в CLR? Как я вижу, нет ничего, что могло бы сломаться, если бы была допущена ко / противо-дисперсия, так какова причина этого?

Аналогичный вопрос можно задать для расширения параметров доступа - например, переопределение защищенного внутреннего метода общедоступным методом (что поддерживается Java, IIRC)

Ответы [ 5 ]

3 голосов
/ 08 мая 2009

Эрик Липперт уже ответил таким образом лучше, чем я мог.

Посмотрите его серию по Ковариация и Контравариантность в C #

и

Как реализована общая ковариантность и контрастность в C # 4.0?

РЕДАКТИРОВАТЬ: Эрик указал, что он не говорит о совпадении типа возврата, но я решил сохранить ссылку в этом ответе, потому что это классная серия статей, и кто-то может найти его полезным, если поискать эту тему. *

Эта функция была запрошена , и почти 5 лет назад Microsoft ответила: «Спасибо за регистрацию этого. Мы много слышим этот запрос. Мы рассмотрим его в следующем выпуске».

А теперь я процитирую Джона Скита, потому что это не будет правильным ответом на StackOverflow без ответа Джона Скита. Ковариационные и пустые типы возврата

Я сильно подозреваю, что ответ лежит в реализации ЦПР а не в какой-либо глубокой семантике причина - CLR, вероятно, должен знать, будет ли там быть возвращаемым значением, чтобы сделать соответствующие вещи со стеком. Несмотря на это, кажется, немного жаль, в Условия элегантности. Я не могу сказать, что я когда-либо чувствовал потребность в этом в реальном жизнь, и это было бы достаточно легко подделать (до четырех параметров) в .NET 3.5 просто написав конвертер от Func<X> до Action<X>, Func<X,Y> до Action<X,Y> и т. д. Это немного смущает хотя:)

2 голосов
/ 05 июля 2011

Этот ответ не говорит о C #, но он помог мне лучше понять проблемы и, возможно, поможет другим: Почему для переопределения нет противопоставления параметров

0 голосов
/ 13 апреля 2015

Швы, вводящие ковариацию возвращаемого значения, не имеют существенного недостатка, как в Java и C ++. Однако существует реальная путаница, вызванная введением противоречивости формального параметра. Я думаю, что этот ответ https://stackoverflow.com/a/3010614/1443505 в C ++ также действителен для C #.

0 голосов
/ 08 мая 2009

Чтобы расширить ответ Джоэла - CLR долгое время поддерживал ограниченную дисперсию, но компилятор C # не использует их до 4.0 с новыми модификаторами "in" и "out" на универсальных интерфейсах и делегатах. Причины сложны, и я бы попал в беспорядок, пытаясь объяснить, но это не так просто, как кажется.

Превращение «защищенного внутреннего» метода в «публичный» метод; Вы можете сделать это с помощью метода скрытия:

public new void Foo(...) { base.Foo(...); }

(если аргументы и т. Д. Также общедоступны) - любое использование?

0 голосов
/ 08 мая 2009

Да, вам просто нужно подождать VS2010 / .Net 4.0.

...