C#,多个==运算符重载没有模糊的空检查

时间:2017-02-21 10:37:38

标签: c# operator-overloading null-check

简介
我有几个类做同样的工作,但有不同的值类型(例如浮点数或整数的向量) 现在我希望能够检查相等性,这种相等性也应该在类型之间起作用(例如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 cast,但这种方法对我来说是一个严重的限制。

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.
[...]

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

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

3 个答案:

答案 0 :(得分:20)

我开始推迟整个设计。我永远不会在不同类型之间使用值语义实现==,我发现它相当混乱:instaceTypedA == instanceTypedB大喊引用相等(至少对我来说)。

如果您需要此功能,请在VectorIVectorF之间实现隐式转换。这就是框架的工作原理。执行以下操作时:

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

过分==(int, double)并非神奇地产生。发生的情况是i被隐式转换为double并且==(double, double)被调用。

答案 1 :(得分:8)

您可以使用is

来改变比较
if (v is VectorF)

如果vnull,则此检查将失败。

答案 2 :(得分:2)

在这种情况下我会做的是不要重载span运算符,而是执行以下操作:

div