2015-07-27 2 views
5

Имея этот код:C# параметр неявное преобразование

class Program 
    { 
     static void Main(string[] args) 
     { 
      Check(3); 
      Console.ReadLine(); 
     } 

     static void Check(int i) 
     { 
      Console.WriteLine("I am an int"); 
     } 

     static void Check(long i) 
     { 
      Console.WriteLine("I am a long"); 
     } 

     static void Check(byte i) 
     { 
      Console.WriteLine("I am a byte"); 
     }  
    } 

Почему этот код печатает «Я ИНТ», а не «Я долго»?

+0

Попробуйте 'Проверить (3L)'. L указывает компилятору, что вы хотите, чтобы литерал был 'long', а не' int' – juharr

+0

возможным дубликатом [C# Method Resolution, long vs int] (http://stackoverflow.com/questions/6125585/c -sharp-method-resolution-long-vs-int) –

ответ

12

Почему этот код печатает «Я - инт», а не «Я длинный»?

Поскольку компилятор проходит правила разрешения перегрузки, которые находятся в спецификации C# 5, начиная с раздела 7.5.3.

Оба из них являются действующие члены функции (т.е. они оба будут действительны для списка аргументов), но метод Check(int) «лучше», чем Check(long) метод (раздел 7.5.3.2), поскольку тип аргумента это int, а преобразование идентичности «лучше», чем расширенное преобразование (раздел 7.5.3.3).

Учитывая неявное C1 преобразования, который преобразует из выражения Е типа T1, и неявное C2 преобразования, который преобразует из выражения Е к типу Т2, С1 является лучшим преобразованием, чем C2, если по крайней мере один из имеет место следующее:

  • Е имеет тип S и преобразование идентичность существует от S до T1, но не от S до T2
  • ...

. Здесь E - int, T1 - int, T2 - long. Там в преобразовании тождественного int в int, но не от int к long ... поэтому применяется это правило, и переход от int к int лучше, чем преобразование из int в long.

+0

Привет, Джон, я обновил свой код, и я добавил еще один метод проверки с параметром байта, но код снова печатает «Я - int». почему 3 считается int, а не байтом? –

+0

и где я могу найти эти правила на сайте MSDN? –

+0

@BudaGavril: я бы не использовал MSDN - я бы загрузил полную спецификацию: http://www.microsoft.com/en-us/download/details.aspx?id=7029 –

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