C# 元组==混淆
假设我定义了两个元组:C# 元组==混淆,c#,.net,tuples,equality,C#,.net,Tuples,Equality,假设我定义了两个元组: Tuple<float, float, float, float> tuple1 = new Tuple<float, float, float, float>(1.0f, 2.0f, 3.0f, 4.0f); Tuple<float, float, float, float> tuple2 = new Tuple<float, float, float, float>(1.0f, 2.0f, 3.0f, 4.0f); 我
Tuple<float, float, float, float> tuple1 = new Tuple<float, float, float, float>(1.0f, 2.0f, 3.0f, 4.0f);
Tuple<float, float, float, float> tuple2 = new Tuple<float, float, float, float>(1.0f, 2.0f, 3.0f, 4.0f);
我希望这两个调用都会返回true。比较的确切内容是什么?对于元组,==正在比较对象引用,因为它不会重载
=
运算符。由于对象是等效的,但不是相同的特定实例,Equals()
返回true
,=
返回false
许多类型不会重载=
,有些类型更喜欢区分Equals()
的等效性和=
的引用等效性
此外,依赖==
进行等效可能会导致一些奇怪之处:
public bool AreSame<T>(T first, T second) where T : class
{
return first == second;
}
是,字符串是等价的,是
T
是string
,但是=
绑定到对象的=
,因为泛型是不受约束的,因此,这将返回false
,即使带有显式string
参数的同一代码将返回true=
正在比较对象引用。Tuple
类不会重载=
操作符,因此需要使用.Equals
=
因为Tuple只会看到引用,因此您会看到它是false
PS:推荐的方法是做如下事情:
var tuple1 = Tuple.Create(1.0f, 2.0f, 3.0f, 4.0f)
重写==运算符不是最佳做法吗?我假设所有.NET类都会重写==运算符。由于Tuple
是不可变的,因此可以合理地认为该类是重载运算符的一个很好的候选者。然而,根据我的经验,我唯一期望这种重载的类是string
或其他准基本类型,如DateTime
,TimeSpan
,等等。感谢我假设=
和Equals
本质上是相同的。我的困惑来自MSDN的重载指南,=
检查的不仅仅是引用相等。最好的经验法则是检查类的文档,看看它们是否实现运算符==,即使这样,我还是更喜欢使用相等()
用于我的等价性检查,因为很明显,您正在寻找等价性检查。但那是我。AFAICT,Areame甚至不会编译。我从编译器中得到以下错误:“运算符'=='不能应用于'T'和'T'类型的操作数”抱歉,您必须说明T:class的位置,因为class==和struct==是两种不同的鸟…谢天谢地,n+1的作用是.0f
,如果没有它,编译器一直在尖叫着要进行双浮点转换
错误…一旦添加了f,就可以删除.0
,即1f
,2f
,等等。
var x = "Hello";
var y = "H";
// doing concat to avoid string interring
AreSame(x, y+"ello");
var tuple1 = Tuple.Create(1.0f, 2.0f, 3.0f, 4.0f)