длинный тип данных для метода принимает int - PullRequest
1 голос
/ 24 мая 2019

Рассмотрим этот код:

static void Main()
{
    int input = 10;

    Console.WriteLine(GetResult(input));
}

static string GetResult(long input)
{
    return (input).ToString();
}

static string GetResult(int input)
{
    return (input).ToString();
}

В нынешнем виде код в методе Main() вызовет второй GetResult(), который принимает параметр int. Если я удаляю второй метод, он автоматически будет использовать первый метод, который принимает параметр long.

Хотя я могу понять, что int как Int32 будет соответствовать long как Int64, я не смог найти объяснения (чтобы помочь моему любопытству) относительно того, как это работает под капот.

Должен ли я просто признать, что это просто работает, или кто-то может предоставить более подробную информацию?

1 Ответ

2 голосов
/ 24 мая 2019

Для этого нужно прочитать спецификации о том, как перегрузка методов работает на языке. Когда будет доступен более конкретный метод сопоставления подписей, он будет вызван. В приведенном выше случае, поскольку Int может быть неявно преобразовано / преобразовано в long, если нет перегрузки, принимающей int, это закончится вызовом другой перегрузки, которая принимает long в качестве ввода.

Например:

int a  = 1;
long b = a; // compiles due to implicit conversion

Также обратитесь к следующей ссылке на документы, чтобы найти неявное преобразование между типами в C #, опубликованное в комментарии @ Fildor :

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/implicit-numeric-conversions-table

Следующий пост должен помочь понять, как работает разрешение перегрузки в C #

https://csharpindepth.com/articles/Overloading

Надеюсь, это поможет.

...