Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can it returns null? (this.Result ==Result.OK)

Tags:

c#

null

return

Can this code return null?

(this.Result == Result.OK)

Can this line (or a similar one) return anything except than true or false (e.g. null)?

like image 223
user2545071 Avatar asked Nov 29 '13 12:11

user2545071


People also ask

How do you know if return is null?

Use "==" to check a variable's value. If you set a variable to null with "=" then checking that the variable is equal to null would return true. variableName == null; You can also use "!= " to check that a value is NOT equal.

Is return 0 the same as null?

There is no difference in assigning zero or NULL to a pointer variable. NULL may be just more readable. When you are returning zero, you are really returning zero. If a function signature has void specified as a return value, it means that the function does not return a value.


2 Answers

(this.Result == Result.OK)

OK; let's take this piece by piece:

this.(anything)

That can fail if this is null - which it never should be, but theoretically can be if you are evil - so we could fail with a NullReferenceException.

this.Result

if that is a property accessor (a get), then it could fail in any way it likes - it could throw an exception.

Result.OK

now; if this is an enum, it is just a ldc - but if this .OK is actually a static property accessor, it can certainly fail with any exception it likes.

this.Result == Result.OK

We need to know what .Result returns; if we assume that it returns a Result (we don't know that), then we still need to know what Result is: if it is an enum it'll be a direct numeric equality check; if it is a nullable-enum, "lifted" equality rules apply, but still resolve cleanly. If it is a custom type that overloads ==, then anything could happen and any exception could result.

But here's the crazy: == does not need to return a bool:

public static int operator ==(int x, Foo foo)
{
    return 0; // DO NOT EVER DO THIS
}
public static int operator !=(int x, Foo foo)
{
    return 0; // DO NOT EVER DO THIS
}

If you the Result type is custom, then (this.Result == Result.OK) can return anything it wants:

using System;
class P
{
    static void Main()
    {
        new P().Test();
    }
    public Result Result { get; set; }
    public void Test()
    {
        var x = (this.Result == Result.OK);
        Console.WriteLine(x.GetType().Name); // Int32
    }
}
public class Result
{
    public static Result OK { get { return null; } }
    public static int operator ==(Result x, Result y)
    {
        return 42; // DO NOT EVER DO THIS
    }
    public static int operator !=(Result x, Result y)
    {
        return 0; // DO NOT EVER DO THIS
    }
}

Finally, we need to consider that something obscure like a ThreadAbortException, OutOfMemoryException or StackOverflowException could happen at any time.

But in sane conditions: yes, it can only result in a bool result.

like image 151
Marc Gravell Avatar answered Sep 19 '22 02:09

Marc Gravell


As == is comparison operator,this statement always return a Bool

like image 35
Cris Avatar answered Sep 20 '22 02:09

Cris