我正在尝试为我的类型实现值相等,但我已经意识到我可以在接口级别上执行此操作,通过为我想要相等的所有接口实现以下函数。
class EqHelper
{
public static bool Eq(I1 x, I1 y) { ... }
public static bool Eq(I2 x, I2 y) { ... }
public static bool Eq(I3 x, I3 y) { ... }
}
I1
,I2
,I3
等是接口,而不是类。我已经在接口上实现了值相等,因为我可以从任何实现类中调用静态EqHelper.Eq
方法并获得值相等。
但我意识到上述功能不会检查null
。
所以我尝试了以下内容:
class EqHelper
{
public static bool Eq<T>(T x, T y)
{
if (x != null && y != null)
{
return EqWorker(x,y);
}
else
{
return (x == null) == (y == null);
}
}
public static bool EqWorker(I1 x, I1 y) { ... }
public static bool EqWorker(I2 x, I2 y) { ... }
public static bool EqWorker(I3 x, I3 y) { ... }
}
但遗憾的是,此Eq
现在无法编译,因为EqWorker
当然不适用于所有T
,只适用于特定的覆盖。
无论如何都能很好地做这个包装吗?我宁愿不把null逻辑放在每个类型的每个相等函数中,这似乎比现在更重复。
在相关的说明中,定义价值平等似乎与讨论in this Microsoft article有点相关。有没有比文章中建议更好的方法呢?
请注意,由于我正在进行的项目,我很遗憾地被C#5
和.NET 2.0
困住了。如果确实需要,我可以偷偷溜到C#6
,但我不愿意,由于WinXP的要求,我绝对不能超过.NET 2.0
。
我只编写了C#
几周的代码,所以请告诉我,我是否做了一些完全愚蠢的事情。