Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Because fred is not a boolean. it is a struct, which has a boolean property called IsNull, or HasValue, or whatever... The object named fred is the complex composite object containing a boolean and a value, not a primitive boolean itself... </p> <p>Below, for example is how a Nullable Int could be implemented. The generic Nullable is almost certainly implemented similarly (but generically). You can see here how the implicit and explicit conversions are implemented..</p> <pre><code>public struct DBInt { // The Null member represents an unknown DBInt value. public static readonly DBInt Null = new DBInt(); // When the defined field is true, this DBInt represents a known value // which is stored in the value field. When the defined field is false, // this DBInt represents an unknown value, and the value field is 0. int value; bool defined; // Private instance constructor. Creates a DBInt with a known value. DBInt(int value) { this.value = value; this.defined = true; } // The IsNull property is true if this DBInt represents an unknown value. public bool IsNull { get { return !defined; } } // The Value property is the known value of this DBInt, or 0 if this // DBInt represents an unknown value. public int Value { get { return value; } } // Implicit conversion from int to DBInt. public static implicit operator DBInt(int x) { return new DBInt(x); } // Explicit conversion from DBInt to int. Throws an exception if the // given DBInt represents an unknown value. public static explicit operator int(DBInt x) { if (!x.defined) throw new InvalidOperationException(); return x.value; } public static DBInt operator +(DBInt x) { return x; } public static DBInt operator -(DBInt x) { return x.defined? -x.value: Null; } public static DBInt operator +(DBInt x, DBInt y) { return x.defined &amp;&amp; y.defined? x.value + y.value: Null; } public static DBInt operator -(DBInt x, DBInt y) { return x.defined &amp;&amp; y.defined? x.value - y.value: Null; } public static DBInt operator *(DBInt x, DBInt y) { return x.defined &amp;&amp; y.defined? x.value * y.value: Null; } public static DBInt operator /(DBInt x, DBInt y) { return x.defined &amp;&amp; y.defined? x.value / y.value: Null; } public static DBInt operator %(DBInt x, DBInt y) { return x.defined &amp;&amp; y.defined? x.value % y.value: Null; } public static DBBool operator ==(DBInt x, DBInt y) { return x.defined &amp;&amp; y.defined? x.value == y.value: DBBool.Null; } public static DBBool operator !=(DBInt x, DBInt y) { return x.defined &amp;&amp; y.defined? x.value != y.value: DBBool.Null; } public static DBBool operator &gt;(DBInt x, DBInt y) { return x.defined &amp;&amp; y.defined? x.value &gt; y.value: DBBool.Null; } public static DBBool operator &lt;(DBInt x, DBInt y) { return x.defined &amp;&amp; y.defined? x.value &lt; y.value: DBBool.Null; } public static DBBool operator &gt;=(DBInt x, DBInt y) { return x.defined &amp;&amp; y.defined? x.value &gt;= y.value: DBBool.Null; } public static DBBool operator &lt;=(DBInt x, DBInt y) { return x.defined &amp;&amp; y.defined? x.value &lt;= y.value: DBBool.Null; } public override bool Equals(object o) { try { return (bool) (this == (DBInt) o); } catch { return false; } } public override int GetHashCode() { return (defined)? value: 0; } public override string ToString() { return (defined)? .ToString(): "DBInt.Null"; } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload