HasFlag
задокументировано следующим образом:
/// <summary>
/// Checks if the certain flag that specifies a characteristic of the annotation
/// is in enabled state (see ISO-320001 12.5.3, "Annotation Flags").
/// </summary>
/// <remarks>
/// Checks if the certain flag that specifies a characteristic of the annotation
/// is in enabled state (see ISO-320001 12.5.3, "Annotation Flags").
/// This method allows only one flag to be checked at once, use constants listed in
/// <see cref="SetFlag(int)"/>
/// .
/// </remarks>
/// <param name="flag">
/// an integer interpreted as set of one-bit flags. Only one bit must be set in this integer, otherwise
/// exception is thrown.
/// </param>
/// <returns>true if the given flag is in enabled state.</returns>
public virtual bool HasFlag(int flag)
Таким образом, параметр должен быть целым числом, интерпретируемым как набор однобитовых флагов. В этом целом числе должен быть установлен только один бит. Очевидно, что для целого числа 3 установлены два бита.
Вы, кажется, думаете, что параметр означает что-то вроде n-й флаг , но на самом деле это означает флаг со значением n .
Допустимые значения: 1, 2, 4, 8, ... но, в частности, не 3.