Здравствуйте, Lloyd, Вы писали:
L>По-моему вполне логичное поведение. Нет?
IMHO да, но багодром не отменяется. Попробую пояснить.
Если есть два метода
void foo(int x){}
void foo(int x, int y = 1){}
и мы делаем вызов
foo(5);
то логичен вызов void foo(int x), т.к. его сигнатура удовлетворяет чилу формальных аргументов, и компилятор, по идее начинает искать методы, начиная с тех, у которых нет формальных параметров, определенных по умолчанию. Исходя из этого, можно считать логичным и вызов foo() без параметров, т.к. там применимы те же рассуждения. Однако, лучше (на мой взгляд, да и на взгляд разработчиков С++) здесь было бы кинуть ambiguous call, т.к. для компилятора есть по крайней мере 2 альтернативы, одна не хуже другой.
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Здравствуйте, __gas, Вы писали:
__>то логичен вызов void foo(int x), т.к. его сигнатура удовлетворяет чилу формальных аргументов, и компилятор, по идее начинает искать методы, начиная с тех, у которых нет формальных параметров, определенных по умолчанию. Исходя из этого, можно считать логичным и вызов foo() без параметров, т.к. там применимы те же рассуждения. Однако, лучше (на мой взгляд, да и на взгляд разработчиков С++) здесь было бы кинуть ambiguous call, т.к. для компилятора есть по крайней мере 2 альтернативы, одна не хуже другой.
Уверен, что в спеке понятие лучше/хуже определено. Кроме того, такое поведение вполне логично.
Здравствуйте, samius, Вы писали:
S>Что-бы было, если бы кто-нибудь зашел на форум C++ и назвал бы C2668 беспределом, потому как в C# по-другому?
Трудно сказать — можете попробовать. Я не хотел бы сравнивать эти два языка и их компиляторы. Но, есть некоторые вещи, которые на мой взгляд, могут приводить к явным ошибкам, и их лучше избегать.
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Здравствуйте, __gas, Вы писали:
__>Здравствуйте, samius, Вы писали:
S>>Что-бы было, если бы кто-нибудь зашел на форум C++ и назвал бы C2668 беспределом, потому как в C# по-другому?
__>Трудно сказать — можете попробовать. Я не хотел бы сравнивать эти два языка и их компиляторы.
А к чему тогда эта тема?
__>Но, есть некоторые вещи, которые на мой взгляд, могут приводить к явным ошибкам, и их лучше избегать.
Согласно этой логике лучше избегать C++, т.к. там способов отстрелить себе ногу явно больше.
Здравствуйте, __gas, Вы писали:
__>Здесь аналогичный случай, но с другим результатом. Так что насчет логичности — это как посмотреть.
И какой из вариантов по-вашему былл бы логично выбрать компилятору в приведенном коде? Если в примере из первого поста вариант напрагивается сам собой, то тут — нет. Плохая аналогия, негодная.
Здравствуйте, Ларик, Вы писали:
Л>Опечатка, если foo вызвать с другим типом что будет?
Правило простое — вначале ищется первый перегруженный метод, с точно совпадающим типом параметра, затем перегруженный метод с параметром того типа, к которому есть неявное приведение, а затем то же, но для методов со значениями параметров по умолчанию. Если ничего не найдено или найдены альтернативы — выдаются ошибки.
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Здравствуйте, Lloyd, Вы писали:
__>>Но, есть некоторые вещи, которые на мой взгляд, могут приводить к явным ошибкам, и их лучше избегать.
L>Значения по умолчанию вообще достаточно опасная штука, особенно в том виде, как они есть. Но тем не менее поведение вполне ожидаемо.
Учитывая, что C# обычно славился своей строгостью, полагаю, что у разработчиков были какие-то весомые причины сделать именно такую реализацию.
Наверняка это должно быть описано в спецификации.
Здравствуйте, __gas, Вы писали:
__>Здравствуйте, samius, Вы писали:
S>>Согласно этой логике лучше избегать C++, т.к. там способов отстрелить себе ногу явно больше.
__>Никто и не спорит, но раз уж C# так упорно начинает копировать С++, то почему бы не быть последовательным до конца?
Когда это C# упорно копировал С++? Скорее уж Delphi, в котором аргументы со значением по умолчанию были всегда. Правда, как в аналогичном лучае dcc32 поступает, судить не берусь ибо не помню, а под рукой его нет.