Подтвердить что ты не робот

С#: литье '0' в int

Я видел такой код:

private readonly object[] m_Values = { (int)0, (int)0 };

Какую идею следует отличать от 0 до int? Разве это не int по умолчанию?

4b9b3361

Ответ 1

Это не обязательно. Я предполагаю, что программист уже укусил. Я опубликую его как головоломку, которая будет перегружена в этой программе?

using System;

class Program {
    static void Main(string[] args) {
        Foo.Bar(0);
        Console.ReadLine();
    }
}

class Foo {
    public static void Bar(byte arg)  { Console.WriteLine("byte overload"); }
    public static void Bar(short arg) { Console.WriteLine("short overload"); }
    public static void Bar(long arg)  { Console.WriteLine("long overload"); }
}

Ответ 2

Я думаю, что бессмысленно иметь это, но единственное место, которое, по моему мнению, может быть полезным, - это то, где исходный кодер хотел предотвратить добавление этого значения в другой тип данных. Рассмотрим пример:

object[] m_Values = { (int)0, (int)0 };
Int16 item = (Int16) m_Values[0];

или

object[] m_Values = { (int)0, (int)0 };
Int64 item = (Int64)m_Values[0];

Вышеизложенное приведет к

Указанное внесение недействительно.

но следующее будет работать:

object[] m_Values = { (int)0, (int)0 };
int item = (int)m_Values[0];

Ответ 3

С# по умолчанию имеет значение Int32, когда вы объявляете целочисленный литерал без предоставления подсказки типа (пока литерал вписывается в Int32, в противном случае он перейдет к Int64). Из здесь:

В С# литеральные значения получают тип от компилятора. Вы можете указать, как ввести числовой литерал, добавив букву в конец номера. Например, чтобы указать, что значение 4.56 следует рассматривать как float, добавьте "f" или "F" после номера