标志枚举的二进制运算

时间:2012-03-28 11:28:38

标签: c# winforms

我正在尝试学习如何创建自定义控件,工具栏。使用.NET Reflector,我试图“重写”ToolStripDesigner类(目前,这意味着只将代码从反射器复制到visual studio中)。因为它使用了System.Design.dll内部的许多类,所以我不得不使用Reflector复制更多的类。在System.Windows.Forms.Design.OleDragDropHandler课程中,我找到了这段代码:

DragDropEffects allowedEffects = DragDropEffects.Move | DragDropEffects.Copy;
for (int i = 0; i < components.Length; i++)
{
    InheritanceAttribute attribute = (InheritanceAttribute) TypeDescriptor.GetAttributes(components[i])[typeof(InheritanceAttribute)];
    if (!attribute.Equals(InheritanceAttribute.NotInherited) && !attribute.Equals(InheritanceAttribute.InheritedReadOnly))
    {
        allowedEffects &= ~DragDropEffects.Move;
        allowedEffects |= 0x4000000;        // this causes error
    }
}

DragDropEffects枚举是公共​​的,包含以下字段:

[Flags]
public enum DragDropEffects {
    Scroll = -2147483648,    // 0x80000000
    All = -2147483645,       // 0x80000003
    None = 0,
    Copy = 1,
    Move = 2,
    Link = 4,
}

如您所见,第一段代码(0x4000000)中没有显示值的字段。 此外,此代码在VS中引发错误:operator |= cannot be applied to operands of type System.Windows.Forms.DragDropEffects and int

所以我的问题是 - 这是如何编译的?或者.NET Reflector在反编译过程中犯了错误?有没有办法绕过它(没有丢失allowedEffects变量中这个奇怪的,未命名的信息)?

3 个答案:

答案 0 :(得分:2)

它似乎看起来像Reflector错过了什么。为了使其编译,您需要明确地将0x4000000强制转换为DragDropEffects

allowedEffects &= ~DragDropEffects.Move;
allowedEffects |= (DragDropEffects)0x4000000;

答案 1 :(得分:1)

将其更改为此并将编译:

allowedEffects |= (DragDropEffects)0x4000000; 

答案 2 :(得分:1)

整数被强制转换为DragDropEffects对象,如ILSpy所示:

enter image description here