C# 与左侧和右侧比较的枚举值被确定为不一致

C# 与左侧和右侧比较的枚举值被确定为不一致,c#,winforms,boolean,C#,Winforms,Boolean,我正在创建一个用C#编写的windows应用程序。我创建了一个类调色板,它定义了一种枚举类型的属性:方向{up,down,right,left}。在另一个类型为Form1的类中,我创建了palete的p实例 以下是一个简化版本: namespace WindowsFormsApplication1 { public class Palette { public Direction _direction { set { thi

我正在创建一个用C#编写的windows应用程序。我创建了一个类
调色板
,它定义了一种枚举类型的属性:
方向{up,down,right,left}
。在另一个类型为
Form1
的类中,我创建了
palete
p
实例

以下是一个简化版本:

namespace WindowsFormsApplication1
{
    public class Palette
    {
        public Direction _direction
        {
            set { this._direction = value; }
            get { return this._direction; }
        }
    }

    public partial class Form1 : Form
    {
        private Palette p;
        public enum Direction
        {
            Left, Right, Up, Down
        }
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            p = new Palette { _direction = Direction.Up };
        }
    }       
那么我想,p.direction也应该是枚举类型,不是吗

我的软件不这么认为,因为我用它来比较 p、 方向!=方向,向上

它认为左边的类型是
调色板。正确的类型是enum


我怎么做

代码未按预期编译的原因是您已将枚举
方向
声明为a,嵌套在外部类型
Form1
中,而引用类型
调色板
不是这样嵌套的。嵌套类型是在类或结构中定义的类型。当由该外部类型中的代码引用时,可以直接使用其名称。也就是说,在
Form1
中,只需执行
Direction.Up
即可引用枚举。但在包含类型之外,必须使用嵌套类型的全名,即
Form1.Direction

因此,要解决您的问题,您可以:

  • Direction
    移动到
    Form1
    之外,使其成为
    WindowsFormsApplication1
    命名空间中的顶级类型

    如果要以多种不同形式使用
    调色板
    ,建议使用此选项

  • 调色板
    方向
    都嵌套在
    表单1

    如果
    调色板
    仅在
    表单1
    中使用,或者需要访问
    表单1
    的私有或受保护成员,则建议使用此选项

  • 调色板中
    使用
    方向的全名

    public Form1.Direction _direction { get; set; }
    
    虽然这将编译,但不建议这样做,因为这样做既笨拙又不一致

  • 顺便说一句,代码中有一个不相关的问题,即
    \u direction
    属性具有无限递归。您应该将其修改为属性,或者使手动创建的备份字段的名称与属性的名称不同

    因此,代码的固定版本可能如下所示:

    public class Palette
    {
        Direction _direction;
    
        public Direction Direction
        {
            set { this._direction = value; }
            get { return this._direction; }
        }
    }
    
    public enum Direction
    {
        Left, Right, Up, Down
    }
    
    public partial class Form1 : Form
    {
        private Palette p;
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            p = new Palette { Direction = Direction.Up };
        }
    }
    
    由于您的完整代码显然已编译,如果要将其移出
    窗体1
    ,则可能会有其他类型的
    WindowsFormsApplication1.Direction
    ,其名称与嵌套的
    Direction
    类型的名称冲突。如果是这样,并且您希望保持
    调色板
    表单
    之外,您的选项是:

  • 如果它们实际上是重复的,只需删除内部嵌套类型即可

  • 如果它们不是重复的,请将
    方向
    枚举重命名为其他名称,例如
    方向类型


  • 你能把有问题的代码贴出来吗?我很难理解到底是什么问题。请加上标点符号。我不会费劲去读这个问题。我真的很想发布我的代码。但是网站不允许我。“我真的很想发布我的代码”请这样做。你应该能把课文正确地放在问题中。每行缩进4个空格,使标记引擎将其识别为代码块。@renesmith-代码和错误消息必须作为文本而不是图像包含在问题中。看看原因。此外,您可能希望学习并阅读有关如何提出可能得到回答的问题的提示。其实是事实 我在表格1和表格2中定义了方向-那将是你的错误。您只需要在一个地方定义它。顺便说一句,你原来的问题没有说明这一点。将来,当你问问题时,请尽量加入一个能证明你的问题的例子。在这种情况下,您的问题没有显示
    方向的两个定义。哦,但是为什么在两个类中定义它是错误的?@renesmith-因为c#是而不是。两种枚举类型
    WindowsFormsApplication1.palete.Direction
    WindowsFormsApplication1.Form1.Direction
    的名称不同,因此它们是不同的类型。它们的内容相同这一事实与此无关。嵌套类型和非嵌套类型不能编译吗?即使它们都是枚举类型?如果我想比较,我需要确保它们是相同的枚举类型,如果我想判断它们是否相同,对吗?