Почему C# 3 позволяет неявное преобразование литерального нуля (0) к какому-либо Перечислению?

Для возвращения изменений только в одном файле в фиксации, как VonC, на который указывают, я был бы checkout ответвление (ведущее устройство или соединительная линия или безотносительно) и затем checkout версия файла, я хотел вернуться и рассматривать его как новую фиксацию:

$ git checkout trunk
$ git checkout 4f4k2a^ a.py
$ git add a.py
$ git diff              #verify I'm only changing what I want; edit as needed
$ git commit -m 'recover function deleted from a.py in 4f4k2a'

существует, вероятно, команда инфраструктуры, которая сделала бы это непосредственно, но я не использовал бы ее, если бы я знал это. Не то, чтобы я не доверяю Мерзавцу, но я не доверяю мне - я не положил бы, что знал, не смотря, что было изменено в том файле в той фиксации и с тех пор. И как только я смотрю, легче просто создать новую фиксацию путем редактирования diff. Возможно, это - просто персональный workstyle.

9
задан Sebastian Good 27 October 2009 в 20:38
поделиться

5 ответов

В C # всегда разрешалось неявное преобразование литерала 0 в любое значение Enum. Изменилось то, как правило применяется к другим постоянным выражениям. Он был сделан более согласованным и позволял неявно преобразовывать любые константные выражения, имеющие значение 0, в перечисление.

Приведенный вами пример дает одинаковое поведение во всех версиях C #.

Вот пример измененного поведения (непосредственно из связанной документации )

public enum E
{
    Zero = 0,
    One = 1,
} 

class A
{
    public static A(string s, object o)
    { System.Console.WriteLine("{0} => A(object)", s); } 

    public static A(string s, E e)
    { System.Console.WriteLine("{0} => A(Enum E)", s); }

    static void Main()
    {
        A a1 = new A("0", 0);
        A a3 = new A("(int) E.Zero", (int) E.Zero);
    }
}

Вывод Visual C # 2005:

 0 => A (Enum E)
(int) E.Zero => A (объект) 

Вывод Visual C # 2008:

 0 => A (Enum E)
(int) E.Zero => A (Enum E) 
10
ответ дан 4 December 2019 в 13:03
поделиться

Я предполагаю, что это потому, что 0 считается" значением по умолчанию "перечислений.

C # (ключевое слово default было введено в C # 2.0 )

enum DbType {
    Unspecified,
    SqlServer
}

DbType t;
int i = 0;

Console.WriteLine(t == i);
Console.WriteLine(i == default(DbType));

Вывод:

True
True
4
ответ дан 4 December 2019 в 13:03
поделиться

Это разрешено, начиная с версии 1.0. Это значение по умолчанию для перечисления.

"Литерал 0 неявно преобразуется к любому типу перечисления. В Visual C # 2005 и более ранние версии компилятора, есть также некоторые постоянные выражения, которые оцениваются как 0, что может неявно преобразовать в любое перечисление тип, но правило, определяющее какое из этих выражений кабриолет непонятно. В Visual C # 2008, все постоянные выражения, которые равны 0 могут быть неявно преобразован в любой тип перечисления. "

2
ответ дан 4 December 2019 в 13:03
поделиться

Как уже упоминалось, 0 - это перечисление по умолчанию. Попытайтесь представить себе перечисления следующим образом (более явным образом):

public enum HairColor
{
    Blonde           = 0x0000;
    Brunett          = 0x0001;
    Red              = 0x0002;
    StrawberryBlonde = 0x0004;
}

Поскольку вы не указываете явно свои значения данного перечисления, C # автоматически присвоит ему значение по умолчанию. Если вы этого не хотите, вам придется явно определить значения для данного перечисления.

0
ответ дан 4 December 2019 в 13:03
поделиться

«Базовым типом элементов перечисления по умолчанию является int. По умолчанию первый перечислитель имеет значение 0, а значение каждого последующего перечислителя увеличивается на 1.» - Это из примечаний MSDN для инфраструктуры 1.1 , так что так было всегда.

0
ответ дан 4 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: