C# 定义运算符==时,空值返回“0”;电话是不明确的;

C# 定义运算符==时,空值返回“0”;电话是不明确的;,c#,null,call,operator-keyword,ambiguous,C#,Null,Call,Operator Keyword,Ambiguous,我有自定义类Rational、Real和Complex。在Complex中,我重载运算符,使我能够比较复数和实数,或复数和有理数。比如说,如果我能定义一个从理性到复杂的隐式转换,那将很容易,但由于不值得深入探讨的原因,我不能 因此,除其他外 ==(复数a,实数b) 而且 ==(实数a,复数b) 显然,当我试图比较 c==null 我收到错误消息,呼叫不明确。我在一个相关的线程上看到了一个想法,我可以定义==(复合体a,对象b)我已经想到了,但是如果我想允许对称,我还需要==(对象a,复合体b),

我有自定义类Rational、Real和Complex。在Complex中,我重载运算符,使我能够比较复数和实数,或复数和有理数。比如说,如果我能定义一个从理性到复杂的隐式转换,那将很容易,但由于不值得深入探讨的原因,我不能

因此,除其他外

==(复数a,实数b)

而且

==(实数a,复数b)

显然,当我试图比较

c==null

我收到错误消息,呼叫不明确。我在一个相关的线程上看到了一个想法,我可以定义
==(复合体a,对象b)
我已经想到了,但是如果我想允许对称,我还需要
==(对象a,复合体b)
,在这种情况下,两个复合体之间的比较也将是不明确的


现在,当我检查null时,我必须首先将复合体转换为一个对象。什么是更好的解决方案?(我希望找到一个通用的解决方案,而不是依赖于类之间的任何关系(例如继承)的解决方案。)

为什么要使用第二个重载?您确定不能在支票中使用第一个吗?没有你正在寻找的“好看”的解决方案。

我认为你有一些类似于
==(复数c,实c)
==(复数c,复数c)
,当然编译器不知道选择哪一个,所以当你与空值比较时,你必须像
c1==(复数)一样强制转换它null

我可能应该发布我认为没有解决方案的帖子,我只是决定放弃对称性,选择==(复数a,对象b)。感谢所有发帖的人

让我看看你的
classes声明
code-plzRahul,我真的在寻找一个独立于类细节的解决方案。也许你没有阅读我文章的其余部分?我一直在以这种方式进行铸造,我正在寻找一种更干净的解决方案。这是出于对对称性的审美渴望,这样我就可以比较
myReal==myComplex
myComplex==myReal
。显然我可以牺牲对称性;我想知道是否有一个好的解决方案,而不必这样做。