Enum.HasFlag, почему нет Enum.SetFlag?

Мне приходится создавать метод расширения для каждого объявленного типа флага, например, так:

public static EventMessageScope SetFlag(this EventMessageScope flags, 
    EventMessageScope flag, bool value)
{
    if (value)
        flags |= flag;
    else
        flags &= ~flag;

    return flags;
}

Почему не существует Enum.SetFlag, как существует Enum.HasFlag?

Также, почему это не всегда работает?

public static bool Get(this EventMessageScope flags, EventMessageScope flag)
{
    return ((flags & flag) != 0);
}

Например, если у меня есть:

var flag = EventMessageScope.Private;

И проверить это как:

if(flag.Get(EventMessageScope.Public))

Где EventMessageScope.Public действительно EventMessageScope.Private | EventMessageScope.PublicOnly, то возвращается true.

Когда это не так, потому что Private не является публичным, это просто полупубличный вариант.

То же самое касается:

if(flag.Get(EventMessageScope.None))

Который возвращает false, за исключением того, что область видимости на самом деле None (0x0), когда он всегда должен возвращать true?

31
задан casperOne 1 May 2011 в 21:34
поделиться