Странный фрагмент кода, который я только что открыл в С# (также должен быть прав для других языков CLI, используя .NET structs
).
using System;
public class Program
{
public static void Main(string[] args)
{
int a;
long b;
a = 0;
b = 0;
Console.WriteLine(a.Equals(b)); // False
Console.WriteLine(a.Equals(0L)); // False
Console.WriteLine(a.Equals((long)0)); // False
Console.WriteLine(a.Equals(0)); // True
Console.WriteLine(a.Equals(a)); // True
Console.WriteLine(a == b); // True
Console.WriteLine(a == 0L); // True
Console.WriteLine();
Console.WriteLine(b.Equals(a)); // True
Console.WriteLine(b.Equals(0)); // True
Console.WriteLine(b.Equals((int)0)); // True
Console.WriteLine(b.Equals(b)); // True
Console.WriteLine(b == a); // True
Console.WriteLine(b == 0); // True
}
}
Здесь два интересных момента (при условии, что a
есть int
и b
есть long
):
-
a != b
, ноb == a
; -
(a.Equals(b)) != (a == b)
Есть ли причина, по которой сравнение было реализовано таким образом?
Примечание:.NET 4 использовался, если это имеет значение.