簡體   English   中英

.NET enum.HasFlag()錯誤?

[英].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?

如您所見,斷點被擊中:

breakpointscreenshot

具有以下值:

watchscreenshot

該錯誤(?!)的解決方法是:

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.ShiftKeys.AltKeys.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==ba.HasFlag(b) && b.HasFlag(a) 然后它將正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM