2013-12-17 3 views
6

На самом деле просто для репликации, выход причудливый;Переопределение параметров по умолчанию в C#

Ожидаемый результат "БББ" БББ Фактический выход является "AAA BBB"

Кто-нибудь есть какие-либо MSDN объяснение такого поведения? Я не мог найти.

((a)new b()).test(); 
new b().test(); 


public class a 
{ 
    public virtual void test(string bob = "aaa ") 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class b : a 
{ 
    public override void test(string bob = "bbb ") 
    { 
     HttpContext.Current.Response.Write(bob); 
    } 
} 
+0

Есть ли ((a) (новый b())). Test() дает результаты, которые вы хотите? – rhughes

+4

Ожидаемый выпуск в зависимости * кто *? – Jamiec

+0

Я считаю, что неверно изменять значение по умолчанию для необязательного параметра при переопределении метода. Не меняет ли подпись метода? –

ответ

12

Почему вы ожидаете «bbb bbb»?

Поскольку вы заливка экземпляра a, единственная информацией для компилятора по первому зову является версией с "aaa", так этого значения, что используется.

Во второй версии без броска компилятор может видеть "bbb", поэтому это значение является то, что используется.

Полиморфизм влияет на то, какой метод вызывается - но это не влияет на переданные параметры. По существу, значение по умолчанию поставляется компилятор (в колле-сайте), так что ваш код фактически эквивалентен:

((a)new b()).test("aaa"); 
new b().test("bbb"); 

где "aaa" и "bbb" поставляются во время компиляции, обследование разрешенного метода.

+3

Итак, чтобы повторно подчеркнуть, значения по умолчанию реализованы во время компиляции, а не во время выполнения? –

+1

@BolucPapuccuoglu yes; Я уже добавил немного больше, чтобы подчеркнуть, что –

Смежные вопросы