Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is Nullable<int> a "Predefined value type" - Or how does Equals() and == work here?

For my own implementation of an Equals() method, I want to check a bunch of internal fields. I do it like this:

... _myNullableInt == obj._myNullableInt && _myString == obj._myString && ... 

I would assume, that this compares the values, including null, for equality not the object address (as a reference euqality compare operation would) because:

It is said so for "predefined value types" in this MSDN doc here. I assume Nullable<int> is such a "predefined value type" because of it is in the System Namespace according to this MSDN doc.

Am I right to assume that the VALUES are compared here?

Note: Unit tests showed "Yes", but I wanted to be reassured by others with this question, just in case I missed something.

like image 651
Marcel Avatar asked Jun 16 '14 07:06

Marcel


1 Answers

In C#, there's a concept called "Lifted Operators", described in section 7.3.7 of the language specification (Version 5 download):

Lifted operators permit predefined and user-defined operators that operate on non-nullable value types to also be used with nullable forms of those types. Lifted operators are constructed from predefined and user-defined operators that meet certain requirements, as described in the following

And specifically:

For the equality operators

==  != 

a lifted form of an operator exists if the operand types are both non-nullable value types and if the result type is bool. The lifted form is constructed by adding a single ? modifier to each operand type. The lifted operator considers two null values equal, and a null value unequal to any non-null value. If both operands are non-null, the lifted operator unwraps the operands and applies the underlying operator to produce the bool result.

So, since there's an == operator defined between ints, there's also one defined for int?s

like image 71
Damien_The_Unbeliever Avatar answered Oct 14 '22 14:10

Damien_The_Unbeliever