Code to illustrate :
public struct MyStruct
{
public int SomeNumber;
}
public string DoSomethingWithMyStruct(MyStruct s)
{
if (s == null)
return "this can't happen";
else
return "ok";
}
private string DoSomethingWithDateTime(DateTime s)
{
if (s == null)
return "this can't happen"; // XX
else
return "ok";
}
Now, “DoSomethingWithStruct” fails to compile with : “Operator ‘==’ cannot be applied to operands of type ‘MyStruct’ and ‘<null>‘”. This makes sense, since it doesn’t make sense to try a reference comparison with a struct, which is a value type.
OTOH, “DoSomethingWithDateTime” compiles, but with compiler warning : “Unreachable code detected” at line marked “XX”. Now, I’m assuming that there is no compiler error here, because the DateTime struct overloads the “==” operator. But how does the compiler know that the code is unreachable ? e.g. Does it look inside the code which overloads the “==” operator ? (This is using Visual Studio 2005 in case that makes a difference).
Note : I’m more curious than anything about the above. I don’t usually try to use “==” to compare structs and nulls.
EDIT : I’ll try to simplify my question – why does “DoSomethingWithDateTime” compile, when “DoSomethingWithMyStruct” does not. Both arguments are structs.
It knows that a struct is never null (
Nullable<T>aside); that is enough to emit the warning.There is a known compiler issue in this area, that arose between the C# 2.0 compiler and the C# 3.0 compiler (and remains in the C# 4.0 compiler at the moment) [I’m not sure why you are seeing it on VS2005, though]. The equality test does not raise an unreachable-code warning for custom structs with
==/!=operators.DateTimehas these operators; your struct doesn’t – hence the difference.This issue is logged on connect, and has been looked at fairly recently by the compiler team (who are keen to fix it when opportunity arises).