Почему C # выбирает int и удваивает другие типы данных, когда доступны перегруженные методы? - PullRequest
0 голосов
/ 13 мая 2018

Вот код:

class Program
{

    public static void Main()
    {
        var test = new Test();

        test.Go(1);
        test.Go(100);
        test.Go(10000);
        test.Go(1.0);

        test.Go(100.0);

        test.Go(10000.0);

        test.Go(65535.0);

        test.Go(1000000000);

        test.Go(1000000000.0);
    }

    class Test
    {

        public void Go(int id)
        { Console.WriteLine(id + "int"); }

        public void Go(String id)
        { Console.WriteLine(id + "string"); }

        public void Go(short id)
        { Console.WriteLine(id + "short"); }

        public void Go(long id)
        { Console.WriteLine(id + "long"); }

        public void Go(double id)
        { Console.WriteLine(id + "double"); }

        public void Go(float id)
        { Console.WriteLine(id + "float"); }

        public void Go(decimal id)
        { Console.WriteLine(id + "decimal"); }           
    }
}

1int

100int

10000int

1double

100double

10000double

65535double

1000000000int

1000000000double

Кажется, CLR всегда выбирает int для целочисленного типа и double для типа с плавающей запятой.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

10000 - это 32-разрядный целочисленный литерал, 10000.0 - это двойной литерал, 10000.0f - это литерал с плавающей запятой, 10000.0m - это десятичный литерал, "10000" - это строковый литерал.Чтобы получить 16-битный шорт, вам нужно явно привести: (short)10000.Чтобы получить 64-битную длину, добавьте суффикс L: 10000L.Для целых чисел вы также можете использовать суффикс U, чтобы получить целочисленный литерал без знака: 10000U и 10000UL.

См. Также:

Интересно также рассмотреть возможность изучения Таблицы неявных числовых преобразований (справочник по C #)

0 голосов
/ 13 мая 2018

Причина очень проста. Передавая целое число, очевидно, тип является int. А для десятичных значений по умолчанию используется значение double. Так работает C #.

Другие типы могут быть определены с конкретными обозначениями. например 1.0f будет распознаваться как float, а 100L - как долго.

В документе MSDN указано, что целые числа идентифицируются по диапазону, в котором они лежат. Таким образом, если число может быть целым числом, оно будет. Если нет, то это будет uint, long или ulong в этом порядке.

...