标签: equals-operator

运算符==不能应用于C#中的泛型类型吗?

根据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)

c# generics operators equals-operator

309
推荐指数
10
解决办法
10万
查看次数

Java:整数等于==

从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链接还有相当多的附加信息.它实际上已经回答了我原来的问题,但因为我没有在我的问题中提到自动装箱,所以它没有出现在选定的建议中:

为什么编译器/ JVM不能让autoboxing"正常工作"?

java primitive integer wrapper equals-operator

142
推荐指数
5
解决办法
15万
查看次数

Python中"(1,)== 1"的含义是什么?

我正在测试元组结构,当我使用==运算符时,我发现它很奇怪:

>>>  (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元组尾随逗号语法规则不同.我问==运营商之间的表达群体.

python tuples equals-operator

118
推荐指数
3
解决办法
9718
查看次数

需要在结构中覆盖什么以确保平等正常运行?

正如标题所说:我是否需要覆盖==运营商?怎么样的.Equals()方法?我缺少什么?

.net c# struct operators equals-operator

71
推荐指数
4
解决办法
4万
查看次数

何时复制C#值/对象以及何时复制其引用?

我一遍又一遍地得到同样的问题,我想要引用的对象被复制,或者我想要复制的对象被引用.当我使用=运算符时会发生这种情况.

例如,如果我将对象发送到另一个表单,即:

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)

c# copy reference equals-operator

66
推荐指数
2
解决办法
8万
查看次数

等于(=)和IN与一个值之间的性能差异

当我们使用等号和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中有相同的差异吗?

mysql sql postgresql in-operator equals-operator

55
推荐指数
5
解决办法
1万
查看次数

C#operator ==,StringBuilder.Equals,Object.Equals和Object.ReferenceEquals之间的差异

我有一个关于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),为什么会给出两个不同的结果?

c# stringbuilder object referenceequals equals-operator

26
推荐指数
1
解决办法
2044
查看次数

等于运算符重载:是(x!= y)==(!(x == y))?

我希望这不是重复 - 我搜索了关于相等运算符的其他问题,但除了相关问题中的一些评论之外,我没有找到明确的陈述


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的存在,但人们对其经营者的关系,没有专门的语句==!=运营商.

C++工作组存在相关文档,说......

至关重要的是,相等/不相等[...]表现为彼此的布尔否定.毕竟,如果operator ==()和operator!=()都返回false,那么世界就没有意义了!因此,通常相互实现这些运算符

但是,这仅反映了Common Sense™,并没有指定它们必须像这样实现.


一些背景:我只是试图编写一个函数来检查两个值(未知类型)是否相等,如果不是这样,则打印错误消息.我想说这里所需的概念是类型EqualityComparable.但是对于这个,人们仍然必须写if (!(x==y)) {...},不能if (x!=y) {...},因为这将使用一个不同的运算符,根本没有概念,EqualityComparable甚至可能不同的重载...


更新

我知道程序员基本上可以 …

c++ language-lawyer equals-operator

26
推荐指数
2
解决办法
1525
查看次数

==检查布尔值是否完全相等? - Java

所以我听说如果我将2个字符串与==进行比较,那么只有当它们都引用相同的对象/实例时我才会得到回报.这是字符串.布尔人怎么样?

java boolean equals-operator

25
推荐指数
1
解决办法
5万
查看次数

为什么等于运算符的Integer值直到128数?

为什么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)

java integer equals-operator

25
推荐指数
3
解决办法
2万
查看次数