C # 7.2 default expression and equals (bug?)

I am using Visual Studio 2017 version 15.5.2 and C # version 7.2. To the moment:

Color c = default;                              // or: c = default(Color); no difference
Debug.Print($"{c.Equals(default(Color))}");     // true
Debug.Print($"{c.Equals(default)}");            // false WHY?!

But if I use ValueTuple:

(string s, int i) t = default;                  
Debug.Print($"{t.Equals(default((string, int)))}"); // true
Debug.Print($"{t.Equals(default)}");                // true

Is this supposed to be so?

+4
source share
6 answers

Are these Windows Forms?

Since WinForms System.Drawing.Color.Equals()does not have an overload that accepts Color. Instead, it matters fromObject . The WPF System.Windows.Media.Color.Equals()contains an overload that acceptsColor .

When defaultpassed as an argument Color.Equals(Object), it is passed default(Object)because the compiler points Objectto a type based on its signature. From docs :

default , default(T), T - .

, default(Color) default(Object), Color - , Object - ( null).

ValueTuple.Equals(), , ValueTuple, default default(ValueTuple).

+6

@fharreau : System.Drawing.Color Equals(Color), $"{t.Equals(default)}" : Equals(Object). , default default(Object) null.

System.Windows.Media.Color WPF, Equals(Color), :

System.Windows.Media.Color c = default;
Console.WriteLine($"{c.Equals(default(System.Windows.Media.Color))}");  // true
Console.WriteLine($"{c.Equals(default)}");                              // true

ValueTuple Equals , .

+5

.Equals() object, default object, Color. false.

tuple .Equals() , . docs ValueTuple , :

  • , .
  • . .
+5

, , .

default , .

, :

Color c = Color.White;
bool b = c.Equals(x);

x ? Color Equals, Color, :

public class Object
{
    public virtual bool Equals(object obj)
    ...

, , default object, Color, :

bool b = c.Equals(default(object));

:

bool b = c.Equals(null);

, ?

bool b = c.Equals(default(Color));

? , Color Equals object, , , , - object , , , :

bool b = c.Equals(default(Color));

Color, null, .

+4

, (Tuple) , .

Color.Equals() Object. , . , false.

ValueType.Equals() Object, ValueTuple. ... ValueTuple true. Object true, ValueTuple, false. , Equals ValueTuples , -, ValueTuple.

, default. , ValueTuple , . , , , , true . , ValueTuple , () true.

+3

System.Drawing.Color IEquatable, ValueTuple .

, Object.Equals

0

Source: https://habr.com/ru/post/1692273/


All Articles