C#,multiple ==操作符重载没有模糊的空检查 - 代码日志

C#,multiple ==操作符重载没有模糊的空检查

介绍:
我有几个类做同样的工作,但是使用不同的值类型(例如浮点或整数向量)。
现在我想能够检查相等,这种相似性也应该在类型之间工作(如vectorF == vectorI)。
此外,应该可以做一个空检查(vectorF == null)。

做法:
我的方法是为==和!=运算符创建多个重载,每个可能的组合一个。

public sealed class VectorF
{
    [...]

    public static bool operator == (VectorF left, VectorI right)
    {
        // Implementation...
    }

    public static bool operator == (VectorF left, VectorF right)
    {
        // Implementation...
    }

    // Same for != operator
    [...]
}

问题:
使用多重重载,我不能仅仅使用==操作符进行空检查,因为调用是不明确的。

var v = new VectorF([...]);

if (v == null)    // This call is ambiguous
[...]

我知道有可能使用ReferenceEquals或null转换,但是这对我来说是一个严重的限制。

var v = new VectorF([...]);

if(object.ReferenceEquals(v, null))    // Would work, is not user friendly.
[...]

if(v == (VectorF)null)    // Would also work, is neither user friendly.
[...]

题:
有没有办法以某种方式实现==运算符,它允许简单的空检查,并允许不同向量之间的等式检查?

或者,还有另一种方式可以/应该实现吗?

我会推迟整个设计开始。我不会实现==与不同类型之间的价值语义,我会觉得很混乱:instaceTypedA == instanceTypedB大声提及参考平等(至少对我来说)。

如果你需要这个工作,那么在VectorI和VectorF之间实现一个隐式转换。这是框架如何工作。当您执行以下操作时:

int i = 1;
double d = 1;
var b = i == d;

一个oveload ==(int,double)不是神奇地生成的。发生什么是我被隐式转换为double,并且==(double,double)被调用。

http://stackoverflow.com/questions/42364963/c-multiple-operator-overloads-without-ambiguous-null-check

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:C#,multiple ==操作符重载没有模糊的空检查