Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 元组==混淆_C#_.net_Tuples_Equality - Fatal编程技术网

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)