/// <summary>
/// Specifies flags for the attributes of a method implementation.
/// </summary>
[ComVisible(true)]
[__DynamicallyInvokable]
[Serializable]
public enum MethodImplAttributes
{
[__DynamicallyInvokable] IL = 0,
[__DynamicallyInvokable] Managed = 0,
[__DynamicallyInvokable] Native = 1,
[__DynamicallyInvokable] OPTIL = 2,
[__DynamicallyInvokable] CodeTypeMask = 3,
[__DynamicallyInvokable] Runtime = 3,
[__DynamicallyInvokable] ManagedMask = 4,
[__DynamicallyInvokable] Unmanaged = 4,
[__DynamicallyInvokable] NoInlining = 8,
[__DynamicallyInvokable] ForwardRef = 16,
[__DynamicallyInvokable] Synchronized = 32,
[__DynamicallyInvokable] NoOptimization = 64,
[__DynamicallyInvokable] PreserveSig = 128,
[ComVisible(false), __DynamicallyInvokable] AggressiveInlining = 256,
[__DynamicallyInvokable] InternalCall = 4096,
MaxMethodImplVal = 65535,
}
为什么这个枚举没有用 FlagsAttribute 标记?在您可以在 MSDN 上找到的所有示例中,它都像位域一样使用,并且 MSDN 上的大多数属性指南都符合这个定义。
MethodBuilder.SetImplementationFlags() 甚至暗示除了 MSDN 示例代码之外,它还像标有 [Flags] 的枚举一样使用。
最佳答案
您始终可以对这些枚举使用位操作,即使它们没有用 FlagsAttribute
标记。实际上FlagsAttribute
只是在.ToString
方法中使用,使输出的字符串更加漂亮。
enum DataFlag
{
Private = 1,
Important = 2,
Persistant = 4
}
var flag = DataFlag.Private | DataFlag.Persistant;
var test = flag.HasFlag(DataFlag.Private); //True with/without FlagAttribute
var stringResult = flag.ToString(); // with FlagAttribute: Private, Persistant
// without : 5
顺便说一下,这个枚举有 MethodImplAttributes.IL = 0
,它不会出现在 .ToString
输出中,即使你有 FlagsAttribute
,并且有几个字段具有相同的值,这可能会导致意外的行为字符串结果。一般来说,不使用 FlagsAttribute
标记此属性是正确的良好做法。
关于c# - 为什么 MethodImplAttributes 没有标记 FlagsAttribute?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38689649/