Резюме для программиста
Кстати, вот тут из списка Каверзные вопросы по C# / Habr задачка 2 непонятна. Как я понимаю, базовый метод скрывается в унаследованном классе, поэтому передаваемый int приводится к double в функции наследующего класса и вызывается собственно эта функция, а не из базового класса? Т.е. тут главное, что метод скрывается, а потом уже работает приведение типов, причём неявное.
А вот если поменять тип, и передать дабл в метод, который в классе В бы принимал инт, то компилятор выдал бы предупреждение о нужности явной конверсии при передаче параметра, как я понимаю? Тут надо знать заранее, а не проверять на деле, т.к. на собесе перед вами только листочек с вопросами.
Нифига. Сейчас проверил. Если поменять инт и дабл местами в типах параметров методов, и передать в вызванный метод дабл, то будет вызвать метод базового класса. Значит, приведение типов влияет на выбор метода в группе - если возможно неявное приведение, то оно будет выполнено и методы базовых классов рассматриваться не будут. А если невозможно, то будут. А если сделать явное приведение, то опять будет работать правило с неявным приведением:
class Program { static void Main(string[] args) { Child c = new Child(); c.Foo((int)10.10); } } class Parent { public void Foo(int x) { Console.WriteLine("Parent.Foo(int x)"); } } class Child : Parent { public void Foo(double y) { Console.WriteLine("Child.Foo(double y)"); } }
Здесь выводится "Child.Foo(double y)". Как я понимаю, компилятор после моей явной конверсии из дабла в инт делает потом неявную из инта обратно в дабл и применяет метод из класса потомка.
Короче, показанная здесь и в таком виде иерархия классов - зло. Слишком много магии происходит по всяким "соглашениям", знание которой и проверяют такие задачки.