Метод перегрузки разрешения и тизеры мозга Джона Скита - PullRequest
23 голосов
/ 30 апреля 2010

Головоломки Джона

Здесь будут спойлеры ...

Я смотрю на ответ на # 1, и должен признать, что никогда не знал, что это был случай разрешения перегрузки Но почему это это так. В моем крошечном уме Derived.Foo(int) кажется логичным путем спуска.

Какая логика стоит за этим дизайнерским решением?

ВРЕМЯ БОНУСА!

Является ли это поведение результатом спецификации C #, реализации CLR или компилятора?

Ответы [ 5 ]

14 голосов
/ 30 апреля 2010

Это поведение продуманное и тщательно продуманное. Причина в том, что этот выбор смягчает воздействие одной из форм хрупкого базового класса.

Прочтите мою статью на эту тему для более подробной информации.

http://blogs.msdn.com/ericlippert/archive/2007/09/04/future-breaking-changes-part-three.aspx

1 голос
/ 30 апреля 2010

Это результат компилятора, мы изучили код IL.

1 голос
/ 30 апреля 2010

Вот возможное объяснение:

Когда компилятор связывает вызовы метода, первое место он ищет в классе, который является самым низким в цепочке наследования (в данном случае класс Derived). Это методы экземпляра проверены и сопоставлены. Переопределенный метод Foo не является методом экземпляра Derived, это метод экземпляра класса Base.

Причиной может быть производительность, как предлагал Jack30lena, но также и то, как компилятор интерпретирует намерение кодера. Это безопасное предположение, что предполагаемое поведение кода разработчика лежит в коде в нижней части цепочки наследования.

0 голосов
/ 30 апреля 2010

Причина в том, что это неоднозначно.Компилятор просто должен выбрать один.И кто-то думал, что менее косвенный будет лучше (производительность может быть причиной).Если разработчик только что написал:

((Base)d).Foo (i);

, это понятно и дает ожидаемый результат.

0 голосов
/ 30 апреля 2010

причина: производительность. вызов виртуального метода занимает немного больше времени. вызов делегата для виртуального метода занимает гораздо больше времени и т. д.

см: Стоимость вызовов метода

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