Friday, February 4, 2011

C#: Is there any difference between bool? and Nullable<bool> ?

In C# are the nullable primitive types (i.e. bool?) just aliases for their corresponding Nullable<T> type or is there a difference between the two?

  • A Nullable<T> is a structure consisting of a T and a bit flag indicating whether or not the T is valid. A Nullable<bool> has three possible values: true, false and null.

    Edit: Ah, I missed the fact that the question mark after "bool" was actually part of the type name and not an indicator that you were asking a question :). The answer to your question, then, is "yes, the C# bool? is just an alias for Nullable<bool>".

    spoulson : This didn't answer the question.
    Curt Hagenlocher : Yes, I realized that after seeing your answer. Thanks!
  • Null primitives are just regular primitives wrapped in Nullable. Any appearances to the contrary are just the compiler and syntactical sugar.

    From Will
  • A bool is a value type, therefore it can't contain a NULL value. If you wrap any value type with Nullable<>, it will give it that ability. Moreover, access methods to the value change by additional properties HasValue and Value.

    But to the question: Nullable<bool> and bool? are aliases.

    Konrad Rudolph : Why is someone systematically downvoting correct answers?
    Chris Marisic : Even though this comment was from way back it's possible that they felt this answer duplicated other answers so they DV'd?
    spoulson : Apparently I'm not the fastest gun in the west. All the top answers are within a few minutes.
    From spoulson
  • There is no difference between bool? b = null and Nullable<bool> b = null. The ? is just C# compiler syntax sugar.

    From samjudson
  • To access the value of the bool? you need to do the following:

    bool? myValue = true;
    bool hasValue = false;
    
    if (myValue.HasValue && myValue.Value)
    {
      hasValue = true;
    }
    

    Note you can't just do:

    if (myValue)
    {
      hasValue = true;
    }
    
    rohancragg : hmm, not sure whether or not to up-vote this as it doesnt answer the question but it's useful and succinct nonetheless! ;-)
    Mark Ingram : Well, according to Joel you should up-vote if you find it useful - not neccessarily if it's the answer. But then I would say that ;)
  • If you look at the IL using ILDasm, you'll find that they both compile down to Nullable<>.

  • No there is no difference. In summary:

    System.Boolean -> valid values : true, false

    bool -> alias for System.Boolean

    Nullable<bool> -> valid values : true, false, null

    bool? -> alias for Nullable<bool>

    Hope this helps.

    From morechilli

0 comments:

Post a Comment