Неожиданное поведение enum - PullRequest
0 голосов
/ 18 февраля 2019

Я реализовал метод с System.Drawing.RotateFlipType и получил странное поведение при сравнении значений.

System.Drawing.RotateFlipType item1 = System.Drawing.RotateFlipType.RotateNoneFlipNone;
System.Drawing.RotateFlipType item2 = System.Drawing.RotateFlipType.Rotate180FlipXY;
Console.WriteLine(item1 == item2); //true

Как это могло быть правдой?

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

RotateNoneFlipNone и RotateNoneFlipXY оба имеют значение 0.

//
// Summary:
//     Specifies no clockwise rotation and no flipping.
RotateNoneFlipNone = 0,
//
// Summary:
//     Specifies a 180-degree clockwise rotation followed by a horizontal and vertical
//     flip.
Rotate180FlipXY = 0,

Их на самом деле больше, и это имеет смысл.Как и вращение на 270 по часовой стрелке или на 90 против часовой стрелки, все равно.

0 голосов
/ 18 февраля 2019

Значения одинаковые, посмотрите здесь: https://docs.microsoft.com/en-us/dotnet/api/system.drawing.rotatefliptype?view=netframework-4.7.2

0 голосов
/ 18 февраля 2019

Как указано кантон7 в комментарии ,

Если вы думаете об этом, это имеет смысл.«Задает поворот на 180 градусов по часовой стрелке с последующим горизонтальным и вертикальным переворотом».Сделайте это преобразование в своей голове, и вы вернетесь туда, откуда начали.

По этой причине RotateFlipType значения RotateNoneFlipNone и Rotate180FlipXY оба имеют одинаковое значение (из 0) ( API-источник ).

Это становится очевидным в справочном источнике (без учета комментариев XML):

public enum RotateFlipType
{
    RotateNoneFlipNone = 0,
    Rotate90FlipNone   = 1,
    Rotate180FlipNone  = 2,
    Rotate270FlipNone  = 3,
    RotateNoneFlipX    = 4,
    Rotate90FlipX      = 5,
    Rotate180FlipX     = 6,
    Rotate270FlipX     = 7,
    RotateNoneFlipY    = Rotate180FlipX,
    Rotate90FlipY      = Rotate270FlipX,
    Rotate180FlipY     = RotateNoneFlipX,
    Rotate270FlipY     = Rotate90FlipX,
    RotateNoneFlipXY   = Rotate180FlipNone,
    Rotate90FlipXY     = Rotate270FlipNone,
    Rotate180FlipXY    = RotateNoneFlipNone,
    Rotate270FlipXY    = Rotate90FlipNone
}

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

На самом деле нет причин, по которым у вас не может быть повторяющихся числовых значений.для значений перечисления - фактически спецификация языка C # гласит: :

Несколько членов перечисления могут иметь одно и то же связанное значение.В примере

enum Color 
{
    Red,
    Green,
    Blue,
    Max = Blue
}

показано перечисление, в котором два члена перечисления - Blue и Max - имеют одинаковое значение.

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