Fun with Equality

Isn’t it funny how the “easiest” concepts can be the most complicated?  A reader sent me the following quiz to help us appreciate the subtlies of equality in the system.  Luckily he gave me the answers as well… ;-)          

Consider the following program:

object x = new object();

object y = new object();

/*Question 1*/ Console.WriteLine(x == y && !x.Equals(y));

/*Question 2*/ Console.WriteLine(x != y && x.Equals(y));

/*Question 3*/ Console.WriteLine(x == y);

/*Question 4*/ Console.WriteLine(x == y && (object)x != (object)y);

 

They should all print “false” right?

 

For each question, find a way to declare and initialize and y such that:

            Question 1: prints true

            Question 2: prints true

            Question 3: does not even compile

            Question 4: prints true

Notice, we are not asking for a solution that works for all 4, one solution for each will be fine…

 

All answers should be of the form:

         public static void Question<<question number>>()

        {

            <<type>> x = <<intialize instance>>;

            <<type>> y = <<intialize instance>>;

            Console.WriteLine(<<question>>);

        }

 

So for example, a legal (but incorrect) answer to question1 would be:

         public static void Question1()

        {

            string x = "1";

            object y = new Object() ;

            Console.WriteLine(x == y && !x.Equals(y));

        }

 

 

The rules of the game:

  1. You can only use “base” data types: object, string, Int32, double, Type, etc
  2. No more than two lines of plainly formatted code (before the Console.WriteLine)
  3. You can’t change anything about the question line, it has to appear exactly as I show above
  4. Extra credit for getting solutions no one else thinks of and for pointing out differences between versions of the CLR
Published 03 April 05 10:51 by BradA
Filed under: ,

Comments

# Judah Himango said on April 4, 2005 12:25 AM:
// Question 1:
public static void Question1()
{
int x = 5;
float y = 5f;
Console.WriteLine(x == y && !x.Equals(y));
}

In 2.0, you've got the various int.Equals, float.Equals, etc. methods, whereas in previous versions these Equal methos were just calling the Object.Equals method.

// Question 2:
public static void Question2()
{
object x = 5.ToString();
string y = 5.ToString();
Console.WriteLine(x != y && x.Equals(y));
}

// Question 3:
public static void Question3()
{
int x = 5;
object y = new object();
Console.WriteLine(x == y); // Can't compare int and object
}

// Question 4:
public static void Question4()
{
int x = 5;
int y = 5;
Console.WriteLine(x == y && (object)x != (object)y);
}
# TAG said on April 4, 2005 12:21 AM:
public static void Question1() {
int x = 1;
long y = 1;
Console.WriteLine(x == y && !x.Equals(y));
}
public static void Question2() {
double x = double.NaN;
double y = double.NaN;
Console.WriteLine(x != y && x.Equals(y));
}
public static void Question3() {
Char x = 'a';
String y = "a";
Console.WriteLine(x != y && x.Equals(y));
}
public static void Question4() {
int x = 1;
long y = 1;
Console.WriteLine(x == y && (object)x != (object)y);
}
# TheMuuj said on April 4, 2005 1:05 AM:
//My solutions, which play with Nullable<T> and String (and Nullable<String>)

//If you switch the data types (int? x and int y) then this returns false
public static void Question1() {
int x = 0;
int? y = 0;
Console.WriteLine(x == y && !x.Equals(y));
}

//Reference equality vs value equality
public static void Question2() {
object x = "";
object y = String.Copy("");
Console.WriteLine(x != y && x.Equals(y));
}

// Operator '==' cannot be applied to operands of type 'string?' and 'string'
// I'm not sure why this is the case, but C# doesn't seem to lift operators when T is a reference type
public static void Question3() {
string? x = "";
string y = "";
Console.WriteLine(x == y && (object)x != (object)y);
}

// This one acts returns false on .NET 1.1,
// but mscorlib in 2.0 does not intern its own strings, including String.Empty
public static void Question4() {
string x = String.Empty;
string y = "";
Console.WriteLine(x == y && (object)x != (object)y);
}
# aditm said on April 4, 2005 2:04 AM:
public static void Question1()
{
char x = 'X';
int y = 88;
Console.WriteLine(x == y && !x.Equals(y));
}

public static void Question2()
{
object x =true;
object y = true;
Console.WriteLine(x != y && x.Equals(y));
}
public static void Question3()
{
bool x =true;
string y = "true";
Console.WriteLine(x == y);
}
public static void Question4()
{
int x =1;
int y = 1;
Console.WriteLine(x == y && (object)x != (object)y);
}
# BradA said on April 4, 2005 10:30 PM:
This is a test
# aleemkhan said on May 11, 2005 3:48 AM:
public static void Question1()
{
int x = 10;
long y = 10;
Console.WriteLine(x==y && !x.Equals(y));
}
public static void Question2()
{
object x = 10;
object y = 10;
Console.WriteLine(x!=y && x.Equals(y));
}
public static void Question3()
{
object x = new object();
int y = 10;
Console.WriteLine(x==y);
}
public static void Question4()
{
int x = 10;
int y = 10;
Console.WriteLine(x==y && (object)x!=(object)y);
}
# Smetje said on July 1, 2005 8:40 PM:
/* Personal comment: great quiz :-) */
using System;

class Quiz
{
public static void Main()
{
Question1();
Question2();
Question3();
Question4();
}

public static void Question1()
{
int x = 1;
double y = 1;
Console.WriteLine(x == y && !x.Equals(y));
}

public static void Question2()
{
object x = 1;
object y = 1;
Console.WriteLine(x != y && x.Equals(y));
}

public static void Question3()
{
int x = 1;
string y = "1";
Console.WriteLine(x == y);
}

public static void Question4()
{
int x = 1;
double y = 1.0;
Console.WriteLine(x == y && (object)x != (object)y);
}
}
# Fun with Equality « Aleem’s Weblog said on October 10, 2006 5:25 AM:

PingBack from http://aleemkhan.wordpress.com/2005/05/11/fun-with-equality/

# Jokes by City » Brad Abrams : Fun with Equality said on March 20, 2008 1:50 AM:

PingBack from http://cityjokesblog.info/brad-abrams-fun-with-equality/

New Comments to this post are disabled

Search

Go

This Blog

Syndication

Page view tracker