在IronPython中比较枚举值

4

在 IronPython 脚本中,我试图比较一个由 C# 创建的对象的属性(类型为 Grade)与 Grade 枚举中的一个可能值。例如:

if (myObject.TotalGrade == Grade.Fail):

现在,我在获取这两个值后设置了一个断点,并且我确实可以验证它们都保存了“Fail”; 但是,检查失败并且程序继续执行下一个子句。Python的等号运算符是否不适用于C#枚举?

额外信息:我已经像下面展示的那样从我的C#中导入了Grade枚举。

import clr
clr.AddReferenceToFile("mydll.dll")
from mydll import Grade

2
不确定为什么它们不相等,但显然在IronPython中枚举被实现为装箱类型 - 看起来你有两个不同的对象表示相同的枚举值。您可以通过直接比较底层值来解决此问题,例如 myObject.TotalGrade.value__ == Grade.Fail.value__ - Cameron
@Cameron 哇,我不知道你是怎么找到的,但那些电子邮件的交流真是无价的。感谢你解决了这个谜团。你能把你的评论发表为答案吗?这样我就可以接受它了。 - estebro
已添加答案。至于邮件列表,我只是在谷歌上搜索了一下有关IronPython枚举的信息;-) - Cameron
再次感谢您的帮助。 - estebro
1个回答

5

如您要求的,以下是我的答案评论:

我不确定为什么它们不相等,但显然在IronPython中枚举被实现为装箱类型 - 在这种情况下,似乎对于相同的枚举值您有两个不同的对象。

您可以通过直接比较底层值来解决此问题,像这样:

if myObject.TotalGrade.value__ == Grade.Fail.value__:
    pass  # your code here...

我也很困惑为什么它对estebro不起作用。解决方法是有效的。我已经创建了一个问题片段,按照我的理解它可以正常工作 https://github.com/paweljasinski/ironsnips/tree/master/dotnetenums - Pawel Jasinski
@Pawel:嗯,奇怪的是这个可以工作,但 OP 的不能。也许有一些微妙的细节,比如多个 IronPython 托管上下文或多个应用程序域?我曾经追踪过的最后一个 IronPython bug 花了我 7 小时,所以我不太想去寻找这个(更微妙的)问题 :-) - Cameron
如果我无法复制,就无法进行调试。 - Pawel Jasinski
嗯...我会尝试@PawelJasinski的代码并回报。 - estebro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接