Явный багодром
От: __gas  
Дата: 25.10.10 07:11
Оценка:
Еще интереснее, что следующий код имеет неосторожность компилироваться:

  class Program
  {
    static void foo()
    {
      Console.WriteLine("foo()");
    }
    static void foo(string txt = "foo(string txt)")
    {
      Console.WriteLine(txt);
    }
    static void Main(string[] args)
    {
      foo(); //здесь вызов foo без параметров
    }
  }


аналогичный беспредел в С++ дает законный error C2668: 'foo' : ambiguous call to overloaded function
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Re: Явный багодром
От: Ларик Россия  
Дата: 25.10.10 07:37
Оценка:
Здравствуйте, __gas, Вы писали:

__>Еще интереснее, что следующий код имеет неосторожность компилироваться:


Я правильно угадал что она по идее "foo()" выведет? А если foo(int i); вызвать (i определить заранее) что будет?
Самая большая в мире ложь — "Я прочел и согласен с условиями пользовательского соглашения".
Re: Явный багодром
От: Lloyd Россия  
Дата: 25.10.10 07:40
Оценка: 1 (1) +3 -1
Здравствуйте, __gas, Вы писали:

__>Еще интереснее, что следующий код имеет неосторожность компилироваться:


По-моему вполне логичное поведение. Нет?
Re[2]: Явный багодром
От: __gas  
Дата: 25.10.10 07:42
Оценка:
Здравствуйте, Ларик, Вы писали:

Л>Я правильно угадал что она по идее "foo()" выведет?


А чего там угадывать? В комментарии я вроде недвусмысленно об это мнаписал.

Л>А если foo(int i); вызвать (i определить заранее) что будет?


Не понял вопрос. Если есть foo(int i = 0) и вызвать foo(5), то конечно, вызовется foo(int ш) со значением 5.
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Re: Явный багодром
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.10.10 07:45
Оценка:
Здравствуйте, __gas, Вы писали:

__>аналогичный беспредел в С++ дает законный error C2668: 'foo' : ambiguous call to overloaded function


Что-бы было, если бы кто-нибудь зашел на форум C++ и назвал бы C2668 беспределом, потому как в C# по-другому?
Re[2]: Явный багодром
От: __gas  
Дата: 25.10.10 07:47
Оценка: 1 (1)
Здравствуйте, 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% людей верят утверждениям, начинающимся со слов «как известно».
Re[3]: Явный багодром
От: Lloyd Россия  
Дата: 25.10.10 07:56
Оценка:
Здравствуйте, __gas, Вы писали:

__>то логичен вызов void foo(int x), т.к. его сигнатура удовлетворяет чилу формальных аргументов, и компилятор, по идее начинает искать методы, начиная с тех, у которых нет формальных параметров, определенных по умолчанию. Исходя из этого, можно считать логичным и вызов foo() без параметров, т.к. там применимы те же рассуждения. Однако, лучше (на мой взгляд, да и на взгляд разработчиков С++) здесь было бы кинуть ambiguous call, т.к. для компилятора есть по крайней мере 2 альтернативы, одна не хуже другой.


Уверен, что в спеке понятие лучше/хуже определено. Кроме того, такое поведение вполне логично.
Re[2]: Явный багодром
От: __gas  
Дата: 25.10.10 07:58
Оценка:
Здравствуйте, samius, Вы писали:

S>Что-бы было, если бы кто-нибудь зашел на форум C++ и назвал бы C2668 беспределом, потому как в C# по-другому?


Трудно сказать — можете попробовать. Я не хотел бы сравнивать эти два языка и их компиляторы. Но, есть некоторые вещи, которые на мой взгляд, могут приводить к явным ошибкам, и их лучше избегать.
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Re[4]: Явный багодром
От: __gas  
Дата: 25.10.10 08:05
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Уверен, что в спеке понятие лучше/хуже определено. Кроме того, такое поведение вполне логично.


"Логично какой-то одной логичностью" (с) не помню кто.


    static void foo(int i, double j)
    {
    }

    static void foo(double i, int j)
    {
    }

    static void Main(string[] args)
    {
      foo(0, 5);
    }


Здесь аналогичный случай, но с другим результатом. Так что насчет логичности — это как посмотреть.
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Re[3]: Явный багодром
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.10.10 08:05
Оценка:
Здравствуйте, __gas, Вы писали:

__>Здравствуйте, samius, Вы писали:


S>>Что-бы было, если бы кто-нибудь зашел на форум C++ и назвал бы C2668 беспределом, потому как в C# по-другому?


__>Трудно сказать — можете попробовать. Я не хотел бы сравнивать эти два языка и их компиляторы.

А к чему тогда эта тема?

__>Но, есть некоторые вещи, которые на мой взгляд, могут приводить к явным ошибкам, и их лучше избегать.

Согласно этой логике лучше избегать C++, т.к. там способов отстрелить себе ногу явно больше.
Re[4]: Явный багодром
От: __gas  
Дата: 25.10.10 08:08
Оценка:
Здравствуйте, samius, Вы писали:

S>А к чему тогда эта тема?


Если честно, то я хотел отписаться здесь
Автор:
Дата: 04.03.04
, но что-то как-то не вышло у меня (видать не туда чего-то жамкнул)
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Re[5]: Явный багодром
От: Lloyd Россия  
Дата: 25.10.10 08:10
Оценка: +1
Здравствуйте, __gas, Вы писали:

__>Здесь аналогичный случай, но с другим результатом. Так что насчет логичности — это как посмотреть.


И какой из вариантов по-вашему былл бы логично выбрать компилятору в приведенном коде? Если в примере из первого поста вариант напрагивается сам собой, то тут — нет. Плохая аналогия, негодная.
Re[4]: Явный багодром
От: __gas  
Дата: 25.10.10 08:10
Оценка:
Здравствуйте, samius, Вы писали:

S>Согласно этой логике лучше избегать C++, т.к. там способов отстрелить себе ногу явно больше.


Никто и не спорит, но раз уж C# так упорно начинает копировать С++, то почему бы не быть последовательным до конца?
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Re[3]: Явный багодром
От: Lloyd Россия  
Дата: 25.10.10 08:12
Оценка:
Здравствуйте, __gas, Вы писали:

__>Но, есть некоторые вещи, которые на мой взгляд, могут приводить к явным ошибкам, и их лучше избегать.


Значения по умолчанию вообще достаточно опасная штука, особенно в том виде, как они есть. Но тем не менее поведение вполне ожидаемо.
Re[3]: Явный багодром
От: Ларик Россия  
Дата: 25.10.10 08:33
Оценка:
Здравствуйте, __gas, Вы писали:

Опечатка, если foo вызвать с другим типом что будет?
Самая большая в мире ложь — "Я прочел и согласен с условиями пользовательского соглашения".
Re[4]: Явный багодром
От: __gas  
Дата: 25.10.10 08:40
Оценка:
Здравствуйте, Ларик, Вы писали:

Л>Опечатка, если foo вызвать с другим типом что будет?


Правило простое — вначале ищется первый перегруженный метод, с точно совпадающим типом параметра, затем перегруженный метод с параметром того типа, к которому есть неявное приведение, а затем то же, но для методов со значениями параметров по умолчанию. Если ничего не найдено или найдены альтернативы — выдаются ошибки.
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Re[4]: Явный багодром
От: andy1618 Россия  
Дата: 25.10.10 08:54
Оценка:
Здравствуйте, Lloyd, Вы писали:

__>>Но, есть некоторые вещи, которые на мой взгляд, могут приводить к явным ошибкам, и их лучше избегать.


L>Значения по умолчанию вообще достаточно опасная штука, особенно в том виде, как они есть. Но тем не менее поведение вполне ожидаемо.


Учитывая, что C# обычно славился своей строгостью, полагаю, что у разработчиков были какие-то весомые причины сделать именно такую реализацию.
Наверняка это должно быть описано в спецификации.
Re[5]: Явный багодром
От: hardcase Пират http://nemerle.org
Дата: 25.10.10 09:34
Оценка:
Здравствуйте, __gas, Вы писали:

__>Здравствуйте, samius, Вы писали:


S>>Согласно этой логике лучше избегать C++, т.к. там способов отстрелить себе ногу явно больше.


__>Никто и не спорит, но раз уж C# так упорно начинает копировать С++, то почему бы не быть последовательным до конца?


Когда это C# упорно копировал С++? Скорее уж Delphi, в котором аргументы со значением по умолчанию были всегда. Правда, как в аналогичном лучае dcc32 поступает, судить не берусь ибо не помню, а под рукой его нет.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Явный багодром
От: Ларик Россия  
Дата: 25.10.10 11:29
Оценка:
Здравствуйте, __gas, Вы писали:

__>Еще интереснее, что следующий код имеет неосторожность компилироваться:


__>
__>  class Program
__>  {
__>    static void foo()
__>    {
__>      Console.WriteLine("foo()");
__>    }
__>    static void foo(string txt = "foo(string txt)")
__>    {
__>      Console.WriteLine(txt);
__>    }
__>    static void Main(string[] args)
__>    {
int i;
i=5;
__>      foo(i); //здесь вызов foo с i
__>    }
__>  }
__>


Такое скомпилится?
Самая большая в мире ложь — "Я прочел и согласен с условиями пользовательского соглашения".
Re[2]: Явный багодром
От: __gas  
Дата: 25.10.10 11:33
Оценка:
Здравствуйте, Ларик, Вы писали:

Л>Такое скомпилится?


Нет, конечно. А к чему такой вопрос? Я уже вроде все объяснил здесь
Автор: __gas
Дата: 25.10.10
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.