2013-09-05 3 views
1

У меня есть следующий код. Почему он всегда идет на метод «взять (ICollection a)»? Я думаю, что объекту он должен быть LinkedList или HashSet, поэтому он должен вызывать метод двух других меток.ICollection [] в сигнатуре метода

class Program 
{ 
    static void Main(string[] args) 
    { 
     Program p = new Program(); 

     ICollection<String>[] ary = { new LinkedList<String>(), new HashSet<String>() }; 

     foreach (ICollection<String> a in ary) 
     { 
      p.take(a); 
     } 

     for (int i = 0; i < ary.Length; i++) 
     { 
      p.take(ary[i]); 
     } 
    } 


    public void take(HashSet<String> a) 
    { } 

    public void take(LinkedList<String> a) 
    {} 

    public void take(ICollection<string> a) 
    { } 
} 
+3

И почему это помечено Java? –

+4

'' '' 'ICollection' Почему вы ожидаете динамической отправки? Метод вызова определяется во время компиляции. –

+0

@RohitJain Java и C# ведут себя одинаково, поэтому я пометил также Java – Helic

ответ

7

Метод отправки осуществляется на основе типа переменной, а не типа времени выполнения. Это подробно описано в спецификации языка C#, 7.5.3 (Разрешение перегрузки) - нигде внутри этого целого раздела не существует предположения о том, что используется тип времени исполнения . Диспетчерская обрабатывается компилятором, на основе «выражение аргумента»:

Учитывая список аргументов А с набором аргументов выражений {E1, E2, ..., EN} и два действующих членов функции МП и MQ с типами параметров {P1, P2, ..., PN} и {Q1, Q2, ..., QN}, MP определяется как лучший функциональный член, чем MQ, если

• для каждого аргумента, неявное преобразование из EX в QX не лучше, чем неявное преобразование из EX в PX, и

• по крайней мере для одного аргумента преобразование из EX в PX лучше, чем преобразование из EX в QX.

Если вы хотите, чтобы динамической отправки, вы можете сделать это с помощью dynamic:

foreach (ICollection<String> a in ary) 
{ 
    dynamic o = a; 
    p.take(o); 
} 

Или, более краткой форме:

foreach (dynamic a in ary) 
{ 
    p.take(a); 
} 
+0

Спасибо, Рид. Как вы нашли эту информацию? Это вопрос интервью. Для проблем в некоторых вопросах интервью я никогда не видел их в моей работе. Я так поражен, что вы, ребята, можете быстро указывать на нужное место. Почему это? – Helic

+0

@Helic Его в основном учит достаточно знать, что искать - вы должны точно знать, где искать или что искать, тогда его легко найти. Это требует знания вашего материала. –

+0

Есть ли хорошие учебные материалы для этих типов квестов? Я так расстроен этими вопросами, потому что у меня никогда не было возможности увидеть их в моей повседневной работе, но они появляются в интервью. Благодарю. – Helic

2

См: http://msdn.microsoft.com/en-us/library/aa691336(v=vs.71).aspx

И http://msdn.microsoft.com/en-us/library/aa691338(v=vs.71).aspx

Из MSDN:

Учитывая аргумент списка А с набором типов аргументов {A1, A2, ..., AN} и два применимых члена функции MP и MQ с типами параметров {P1, P2, ..., PN} и {Q1, Q2, ..., QN}, MP определены как лучшие членом функции, чем MQ, если:

  • для каждого аргумента, неявное преобразование из AX в PX не хуже, чем неявное преобразование из AX в QX и
  • , по крайней мере, один аргумент, преобразование из AX для PX лучше, чем преобразование из AX в QX.

При выполнении этой оценки, если МП или MQ применим в расширенной форме, то PX или QX относится к параметру в расширенном виде списка параметров.

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