[英].NET enum.HasFlag() bug?
我正在使用以下.NET 4.5.2代码:
if (this.ContainsFocus && keyData == (Keys.Tab|Keys.Shift))
{ ... }
当ContainsFocus(bool = true)和keyData(System.Windows.Forms.Keys)为Keys.O时,为什么表达式为true? Keys.Shift?
如您所见,断点被击中:
具有以下值:
该错误(?!)的解决方法是:
if (this.ContainsFocus && (int)keyData == (int)(Keys.Tab|Keys.Shift))
{ ... }
不, HasFlag
没有错误。 不幸的是,.NET FlagsAttribute
是全有或全无, System.Windows.Forms.Keys
的定义方式是只能将Keys.Modifiers
用作标志。
来自https://msdn.microsoft.com/zh-cn/library/system.windows.forms.keys%28v=vs.110%29.aspx
Keys类包含用于处理键盘输入的常量。 Keys枚举的成员由一个键代码和一组修饰符组成,这些修饰符组合成一个整数值。 在Win32应用程序编程接口(API)中,键值有两个部分,其中高阶位包含键码(与Windows虚拟键码相同),低位位代表键修饰符,例如SHIFT,CONTROL和ALT键。
其结果是,您可以检查任何修饰符(的Keys.Shift
, Keys.Alt
, Keys.Control
)与HasFlag
,但没有别的。
这不是HasFlag
的错误, HasFlag
它的工作方式。
假设我们具有以下值:
var a = (Keys.Tab | Keys.Shift);
var b = (Keys.O | Keys.Shift);
现在,我们分析这些值的位(将它们转换为整数时):
a:1000000000100 000 1
b:1000000000100 111 1
如果我们调用a.HasFlag(b)
我们得到false
,因为并不是每一个从B 1位是在 1太大。 但是,如果我们称之为b.HasFlag(a)
我们得到true
原因的每1位为b设置得。
这就是为什么您需要将值与a==b
或a.HasFlag(b) && b.HasFlag(a)
。 然后它将正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.