根据MSDN中==
运营商的文档,
对于预定义的值类型,如果操作数的值相等,则相等运算符(==)返回true,否则返回false.对于除string之外的引用类型,如果其两个操作数引用同一对象,则==返回true.对于字符串类型,==比较字符串的值.用户定义的值类型可以重载==运算符(请参阅运算符).用户定义的引用类型也是如此,尽管 默认情况下==的行为与上述预定义和用户定义的引用类型相同.
那么为什么这段代码片段无法编译呢?
bool Compare<T>(T x, T y) { return x == y; }
Run Code Online (Sandbox Code Playgroud)
我得到错误运算符'=='不能应用于'T'和'T'类型的操作数.我想知道为什么,因为据我所知,==
运算符是针对所有类型预定义的?
编辑:谢谢大家.起初我没有注意到该声明仅涉及引用类型.我还认为为所有值类型提供了逐位比较,我现在知道这是不正确的.
但是,如果我使用引用类型,==
操作符是否会使用预定义的引用比较,或者如果类型定义了一个,它是否会使用运算符的重载版本?
编辑2:通过反复试验,我们了解到==
操作员在使用不受限制的泛型类型时将使用预定义的参考比较.实际上,编译器将使用它可以为限制类型参数找到的最佳方法,但不会再看了.例如,true
即使Test.test<B>(new B(), new B())
被调用,下面的代码也会始终打印:
class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T …
Run Code Online (Sandbox Code Playgroud) 从Java 1.5中,你几乎可以互换Integer
使用int
在许多情况下.
但是,我发现我的代码中存在一个潜在的缺陷让我感到有些惊讶.
以下代码:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
Run Code Online (Sandbox Code Playgroud)
虽然我无法确定在什么情况下,但是当值相等时,似乎错误地设置了不匹配.我在Eclipse中设置了一个断点,看到这些Integer
值都是137,我检查了布尔表达式并且它说它是假的,但当我跨过它时,它设置不匹配为真.
将条件更改为:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
Run Code Online (Sandbox Code Playgroud)
解决了这个问题.
有谁可以解释为什么会这样?到目前为止,我只在自己的PC上看到了我的localhost上的行为.在这种特殊情况下,代码成功地通过了大约20次比较,但在2次失败.问题始终可以重现.
如果这是一个普遍的问题,它应该导致我们的其他环境(开发和测试)出错,但到目前为止,没有人在执行此代码片段的数百次测试后报告该问题.
==
用于比较两个Integer
值仍然不合法吗?
除了下面的所有精细答案之外,以下stackoverflow链接还有相当多的附加信息.它实际上已经回答了我原来的问题,但因为我没有在我的问题中提到自动装箱,所以它没有出现在选定的建议中:
我正在测试元组结构,当我使用==
运算符时,我发现它很奇怪:
>>> (1,) == 1,
Out: (False,)
Run Code Online (Sandbox Code Playgroud)
当我将这两个表达式分配给变量时,结果为true:
>>> a = (1,)
>>> b = 1,
>>> a==b
Out: True
Run Code Online (Sandbox Code Playgroud)
这个问题与我视图中的Python元组尾随逗号语法规则不同.我问==
运营商之间的表达群体.
正如标题所说:我是否需要覆盖==
运营商?怎么样的.Equals()
方法?我缺少什么?
我一遍又一遍地得到同样的问题,我想要引用的对象被复制,或者我想要复制的对象被引用.当我使用=运算符时会发生这种情况.
例如,如果我将对象发送到另一个表单,即:
SomeForm myForm = new SomeForm();
SomeObject myObject = new SomeObject();
myForm.formObject = myObject;
Run Code Online (Sandbox Code Playgroud)
...然后修改表单中的对象,原始对象不会被修改.就好像复制了对象而没有引用对象.然而,当我这样做时:
SomeObject myObject = new SomeObject();
SomeObject anotherObject = new SomeObject();
anotherObject = myObject;
Run Code Online (Sandbox Code Playgroud)
...然后修改anotherObject
,也myObject
进行修改.
最恶化的情况是当我尝试克隆我定义的一个对象时:
public class SomeObject
{
double value1, value2;
//default constructor here
public SomeObject(val1, val2)
{
value1 = val1;
value2 = val2;
}
public void Clone(SomeObject thingToCopy)
{
this.value1 = thingToCopy.value1;
this.value2 = thingToCopy.value2;
}
}
Run Code Online (Sandbox Code Playgroud)
当我这样做的时候......
SomeObject obj1 = new SomeObject(1, 2);
SomeObject obj2 = new …
Run Code Online (Sandbox Code Playgroud) 当我们使用等号和IN运算符具有相同的值时,SQL引擎有何不同?执行时间是否会改变?
第一个使用等式检查操作符
WHERE column_value = 'All'
Run Code Online (Sandbox Code Playgroud)
第二个使用OR运算符和单值
WHERE column_value IN ('All')
Run Code Online (Sandbox Code Playgroud)
请问SQL引擎更改IN
到=
如果只有一个值吗?
在MySQL和PostgreSQL中有相同的差异吗?
我有一个关于Object.Equals
和的问题Equals(object)
.我的示例代码如下:
class Program
{
static void Main(string[] args)
{
var sb1 = new StringBuilder("Food");
var sb2 = new StringBuilder("Food");
Console.WriteLine(sb1 == sb2);
Console.WriteLine(sb1.Equals(sb2));
Console.WriteLine(Object.Equals(sb1, sb2));
Console.WriteLine(Object.ReferenceEquals(sb1, sb2));
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
False
True
False
False
Run Code Online (Sandbox Code Playgroud)
但就我Object.Equals(sb1, sb2)
内心的 问题而言sb1.Equals(sb2)
,为什么会给出两个不同的结果?
我希望这不是重复 - 我搜索了关于相等运算符的其他问题,但除了相关问题中的一些评论之外,我没有找到明确的陈述
TL;博士:
C++标准是否保证(x!=y)
始终具有相同的真值!(x==y)
?
我知道有很多微妙之处这里涉及:经营者==
和!=
可能超载.它们可能会被重载以具有不同的返回类型(只需要隐式转换为bool
).甚至!
-operator也可能在返回类型上重载.这就是为什么我手动提到上面的"真值",但试图进一步阐述它,利用隐式转换bool
,并试图消除可能的含糊之处:
bool ne = (x!=y);
bool e = (x==y);
bool result = (ne == (!e));
Run Code Online (Sandbox Code Playgroud)
为result
保证是true
在这里吗?
C++标准在5.10节中指定了相等运算符,但主要似乎是在语法上定义它们(以及关于指针比较的一些语义).该概念被EqualityComparable的存在,但人们对其经营者的关系,没有专门的语句==
给!=
运营商.
至关重要的是,相等/不相等[...]表现为彼此的布尔否定.毕竟,如果operator ==()和operator!=()都返回false,那么世界就没有意义了!因此,通常相互实现这些运算符
但是,这仅反映了Common Sense™,并没有指定它们必须像这样实现.
一些背景:我只是试图编写一个函数来检查两个值(未知类型)是否相等,如果不是这样,则打印错误消息.我想说这里所需的概念是类型EqualityComparable
.但是对于这个,人们仍然必须写if (!(x==y)) {...}
,不能写if (x!=y) {...}
,因为这将使用一个不同的运算符,根本没有概念,EqualityComparable
甚至可能不同的重载...
我知道程序员基本上可以 …
所以我听说如果我将2个字符串与==进行比较,那么只有当它们都引用相同的对象/实例时我才会得到回报.这是字符串.布尔人怎么样?
为什么Integer "="运算符不适用于128和Integer值之后?有人可以解释这种情况吗?
这是我的Java环境:java版"1.6.0_37"
Java(TM)SE运行时环境(版本1.6.0_37-b06)
Java HotSpot(TM)64位服务器VM(内置20.12-b01,混合模式)
示例代码:
Integer a;
Integer b;
a = 129;
b = 129;
for (int i = 0; i < 200; i++) {
a = i;
b = i;
if (a != b) {
System.out.println("Value:"+ i + " - Different values");
} else {
System.out.println("Value"+ i + " Same values");
}
}
Run Code Online (Sandbox Code Playgroud)
控制台输出的一部分:
Value:124 - Same values
Value:125 - Same values
Value:126 - Same values
Value:127 - Same values
Value:128 - Different values
Value:129 …
Run Code Online (Sandbox Code Playgroud)