Почему этот код печатает «Я - инт», а не «Я длинный»?
Поскольку компилятор проходит правила разрешения перегрузки, которые находятся в спецификации 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
.
Попробуйте 'Проверить (3L)'. L указывает компилятору, что вы хотите, чтобы литерал был 'long', а не' int' – juharr
возможным дубликатом [C# Method Resolution, long vs int] (http://stackoverflow.com/questions/6125585/c -sharp-method-resolution-long-vs-int) –