Операторы перечисления и вычитания - PullRequest
15 голосов
/ 12 марта 2011

Кто-нибудь знает (и возможно: с каких пор) оператор -= поддерживается для значений enum?

Я с радостью писал сегодня, когда по какой-то причине написал это, чтобы исключить значение из флагов enum:

flags -= FlagsEnum.Value1;

После перечитывания и оценки моего кода я был удивлен, что он скомпилирован на самом деле.

Запись заявления как

flags = flags - FlagsEnum.Value1

однако не компилируется.

Пока что я не смог найти ничего в документации и в интернете. Кроме того, другие операторы (кроме битовых операторов, конечно) не поддерживаются: += (включая флаг), *= (пересечение в Pascal) не работают.

Это какой-то синтаксический сахар, встроенный в компилятор C #? Если да, то по какой причине они решили не включать других операторов?

Простой пример кода:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    [Flags]
    enum FlagsEnum
    {
        None = 0,
        Value1 = 1,
        Value2 = 2,
        Value3 = 4
    }

    class Program
    {
        static void Main(string[] args)
        {
            FlagsEnum flags = FlagsEnum.Value1 | FlagsEnum.Value2 | FlagsEnum.Value3;
            Console.WriteLine(flags);
            flags -= FlagsEnum.Value1;
            Console.WriteLine(flags);
            flags -= FlagsEnum.Value3;
            Console.WriteLine(flags);
            flags -= FlagsEnum.Value2;
            Console.WriteLine(flags);
            Console.ReadLine();
        }
    }
}

Ответы [ 2 ]

24 голосов
/ 12 марта 2011

Iirc, - - все еще целое вычитание.

Чтобы сделать исключение, вы хотите:

value = value & ~SomeEnum.Flag;

И включение:

value = value | SomeEnum.Flag;

Аналогично, для проверки на частичное совпадение (любой бит из флага):

if((value & SomeEnum.Flag) != 0) {...}

Или полное совпадение (все биты в флаге):

if((value & SomeEnum.Flag) == SomeEnum.Flag) {...}
7 голосов
/ 12 марта 2011

Перечисление вычитания. Каждый тип перечисления неявно предоставляет следующий предопределенный оператор, где E - это тип enum, а U - базовый тип E: Оператор U - (E x, E y); Этот оператор вычисляется точно как (U) ((U) x - (U) y). Другими словами, оператор вычисляет разницу между порядковыми значениями x и y, а тип результата является базовым типом перечисления.

источник

Надеюсь, вы знаете, что можете определить неявные значения для членов перечисления, поэтому, если вы дадите им значения x = 5, y = 10, z = 15 и попытаетесь выполнить z-y, вы получите x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...