1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-14 22:34:09 +02:00

Removed dot-ctor for nullable

This commit is contained in:
Brian Fiete 2020-08-01 07:48:00 -07:00
parent df50100353
commit 1fc6b31ffa
2 changed files with 411 additions and 398 deletions

View file

@ -28,7 +28,7 @@ namespace System
{ {
if (!mHasValue) if (!mHasValue)
{ {
Debug.FatalError("Nullable object must have a value."); Debug.FatalError("Value requested for null nullable.");
} }
return mValue; return mValue;
@ -42,7 +42,7 @@ namespace System
{ {
if (!mHasValue) if (!mHasValue)
{ {
Debug.FatalError("Nullable object must have a value."); Debug.FatalError("Value requested for null nullable.");
} }
return ref mValue; return ref mValue;
@ -239,17 +239,17 @@ namespace System
public static TResult? operator+<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T + TOther where TResult : struct public static TResult? operator+<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T + TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue + rhs); return Nullable<TResult>(lhs.mValue + rhs);
} }
public static TResult? operator+<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther + T where TResult : struct public static TResult? operator+<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther + T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs + rhs.mValue); return Nullable<TResult>(lhs + rhs.mValue);
} }
public static TResult? operator+<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T + TOther where TResult : struct public static TResult? operator+<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T + TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue + rhs.mValue); return Nullable<TResult>(lhs.mValue + rhs.mValue);
} }
/// ///
@ -257,19 +257,19 @@ namespace System
public static TResult? operator-<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther - T where TResult : struct public static TResult? operator-<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther - T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs - rhs.mValue); return Nullable<TResult>(lhs - rhs.mValue);
} }
public static TResult? operator-<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T - TOther where TResult : struct public static TResult? operator-<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T - TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue - rhs); return Nullable<TResult>(lhs.mValue - rhs);
} }
public static TResult? operator-<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T - TOther where TResult : struct public static TResult? operator-<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T - TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue - rhs.mValue); return Nullable<TResult>(lhs.mValue - rhs.mValue);
} }
// //
@ -277,19 +277,19 @@ namespace System
public static TResult? operator*<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther * T where TResult : struct public static TResult? operator*<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther * T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs * rhs.mValue); return Nullable<TResult>(lhs * rhs.mValue);
} }
public static TResult? operator*<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T * TOther where TResult : struct public static TResult? operator*<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T * TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue * rhs); return Nullable<TResult>(lhs.mValue * rhs);
} }
public static TResult? operator*<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T * TOther where TResult : struct public static TResult? operator*<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T * TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue * rhs.mValue); return Nullable<TResult>(lhs.mValue * rhs.mValue);
} }
// //
@ -297,19 +297,19 @@ namespace System
public static TResult? operator/<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther / T where TResult : struct public static TResult? operator/<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther / T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs / rhs.mValue); return Nullable<TResult>(lhs / rhs.mValue);
} }
public static TResult? operator/<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T / TOther where TResult : struct public static TResult? operator/<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T / TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue / rhs); return Nullable<TResult>(lhs.mValue / rhs);
} }
public static TResult? operator/<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T / TOther where TResult : struct public static TResult? operator/<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T / TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue / rhs.mValue); return Nullable<TResult>(lhs.mValue / rhs.mValue);
} }
// //
@ -317,19 +317,19 @@ namespace System
public static TResult? operator%<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther % T where TResult : struct public static TResult? operator%<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther % T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs % rhs.mValue); return Nullable<TResult>(lhs % rhs.mValue);
} }
public static TResult? operator%<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T % TOther where TResult : struct public static TResult? operator%<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T % TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue % rhs); return Nullable<TResult>(lhs.mValue % rhs);
} }
public static TResult? operator%<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T % TOther where TResult : struct public static TResult? operator%<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T % TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue % rhs.mValue); return Nullable<TResult>(lhs.mValue % rhs.mValue);
} }
// //
@ -337,19 +337,19 @@ namespace System
public static TResult? operator^<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther ^ T where TResult : struct public static TResult? operator^<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther ^ T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs ^ rhs.mValue); return Nullable<TResult>(lhs ^ rhs.mValue);
} }
public static TResult? operator^<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T ^ TOther where TResult : struct public static TResult? operator^<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T ^ TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue ^ rhs); return Nullable<TResult>(lhs.mValue ^ rhs);
} }
public static TResult? operator^<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T ^ TOther where TResult : struct public static TResult? operator^<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T ^ TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue ^ rhs.mValue); return Nullable<TResult>(lhs.mValue ^ rhs.mValue);
} }
// //
@ -357,19 +357,19 @@ namespace System
public static TResult? operator&<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther & T where TResult : struct public static TResult? operator&<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther & T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs & rhs.mValue); return Nullable<TResult>(lhs & rhs.mValue);
} }
public static TResult? operator&<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T & TOther where TResult : struct public static TResult? operator&<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T & TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue & rhs); return Nullable<TResult>(lhs.mValue & rhs);
} }
public static TResult? operator&<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T & TOther where TResult : struct public static TResult? operator&<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T & TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue & rhs.mValue); return Nullable<TResult>(lhs.mValue & rhs.mValue);
} }
// //
@ -377,19 +377,19 @@ namespace System
public static TResult? operator|<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther | T where TResult : struct public static TResult? operator|<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther | T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs | rhs.mValue); return Nullable<TResult>(lhs | rhs.mValue);
} }
public static TResult? operator|<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T | TOther where TResult : struct public static TResult? operator|<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T | TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue | rhs); return Nullable<TResult>(lhs.mValue | rhs);
} }
public static TResult? operator|<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T | TOther where TResult : struct public static TResult? operator|<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T | TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue | rhs.mValue); return Nullable<TResult>(lhs.mValue | rhs.mValue);
} }
// //
@ -402,19 +402,19 @@ namespace System
public static TResult? operator??<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther ?? T where TResult : struct public static TResult? operator??<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther ?? T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs ?? rhs.mValue); return Nullable<TResult>(lhs ?? rhs.mValue);
} }
public static TResult? operator??<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T ?? TOther where TResult : struct public static TResult? operator??<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T ?? TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue ?? rhs); return Nullable<TResult>(lhs.mValue ?? rhs);
} }
public static TResult? operator??<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T ?? TOther where TResult : struct public static TResult? operator??<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T ?? TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue ?? rhs.mValue); return Nullable<TResult>(lhs.mValue ?? rhs.mValue);
} }
// //
@ -422,19 +422,19 @@ namespace System
public static TResult? operator<< <TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther << T where TResult : struct public static TResult? operator<< <TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther << T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs << rhs.mValue); return Nullable<TResult>(lhs << rhs.mValue);
} }
public static TResult? operator<< <TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T << TOther where TResult : struct public static TResult? operator<< <TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T << TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue << rhs); return Nullable<TResult>(lhs.mValue << rhs);
} }
public static TResult? operator<< <TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T << TOther where TResult : struct public static TResult? operator<< <TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T << TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue << rhs.mValue); return Nullable<TResult>(lhs.mValue << rhs.mValue);
} }
} }

View file

@ -28,7 +28,7 @@ namespace System
{ {
if (!mHasValue) if (!mHasValue)
{ {
Debug.FatalError("Nullable object must have a value."); Debug.FatalError("Value requested for null nullable.");
} }
return mValue; return mValue;
@ -42,7 +42,7 @@ namespace System
{ {
if (!mHasValue) if (!mHasValue)
{ {
Debug.FatalError("Nullable object must have a value."); Debug.FatalError("Value requested for null nullable.");
} }
return ref mValue; return ref mValue;
@ -54,6 +54,14 @@ namespace System
return mValue; return mValue;
} }
public bool TryGetValue(ref T outValue)
{
if (!mHasValue)
return false;
outValue = mValue;
return true;
}
public T GetValueOrDefault(T defaultmValue) public T GetValueOrDefault(T defaultmValue)
{ {
return mHasValue ? mValue : defaultmValue; return mHasValue ? mValue : defaultmValue;
@ -100,12 +108,12 @@ namespace System
public static bool operator==<TOther>(TOther lhs, Nullable<T> rhs) where bool : operator TOther == T public static bool operator==<TOther>(TOther lhs, Nullable<T> rhs) where bool : operator TOther == T
{ {
if (!rhs.mHasValue) return false; if (!rhs.mHasValue) return false;
return lhs == rhs; return lhs == rhs.mValue;
} }
public static bool operator==<TOther>(Nullable<T> lhs, Nullable<TOther> rhs) where bool : operator T == TOther where TOther : struct public static bool operator==<TOther>(Nullable<T> lhs, Nullable<TOther> rhs) where bool : operator T == TOther where TOther : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return false; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return !lhs.mHasValue && !rhs.mHasValue; // Only both being null results in 'true'
return lhs.mValue == rhs.mValue; return lhs.mValue == rhs.mValue;
} }
@ -120,12 +128,12 @@ namespace System
public static bool operator!=<TOther>(TOther lhs, Nullable<T> rhs) where bool : operator TOther != T public static bool operator!=<TOther>(TOther lhs, Nullable<T> rhs) where bool : operator TOther != T
{ {
if (!rhs.mHasValue) return true; if (!rhs.mHasValue) return true;
return lhs != rhs; return lhs != rhs.mValue;
} }
public static bool operator!=<TOther>(Nullable<T> lhs, Nullable<TOther> rhs) where bool : operator T != TOther where TOther : struct public static bool operator!=<TOther>(Nullable<T> lhs, Nullable<TOther> rhs) where bool : operator T != TOther where TOther : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return false; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return !(!lhs.mHasValue && !rhs.mHasValue); // Only both being null results in 'false'
return lhs.mValue != rhs.mValue; return lhs.mValue != rhs.mValue;
} }
@ -140,7 +148,7 @@ namespace System
public static bool operator< <TOther>(TOther lhs, Nullable<T> rhs) where bool : operator TOther < T public static bool operator< <TOther>(TOther lhs, Nullable<T> rhs) where bool : operator TOther < T
{ {
if (!rhs.mHasValue) return false; if (!rhs.mHasValue) return false;
return lhs < rhs; return lhs < rhs.mValue;
} }
public static bool operator< <TOther>(Nullable<T> lhs, Nullable<TOther> rhs) where bool : operator T < TOther where TOther : struct public static bool operator< <TOther>(Nullable<T> lhs, Nullable<TOther> rhs) where bool : operator T < TOther where TOther : struct
@ -160,7 +168,7 @@ namespace System
public static bool operator<=<TOther>(TOther lhs, Nullable<T> rhs) where bool : operator TOther <= T public static bool operator<=<TOther>(TOther lhs, Nullable<T> rhs) where bool : operator TOther <= T
{ {
if (!rhs.mHasValue) return false; if (!rhs.mHasValue) return false;
return lhs <= rhs; return lhs <= rhs.mValue;
} }
public static bool operator<=<TOther>(Nullable<T> lhs, Nullable<TOther> rhs) where bool : operator T <= TOther where TOther : struct public static bool operator<=<TOther>(Nullable<T> lhs, Nullable<TOther> rhs) where bool : operator T <= TOther where TOther : struct
@ -180,7 +188,7 @@ namespace System
public static bool operator><TOther>(TOther lhs, Nullable<T> rhs) where bool : operator TOther > T public static bool operator><TOther>(TOther lhs, Nullable<T> rhs) where bool : operator TOther > T
{ {
if (!rhs.mHasValue) return false; if (!rhs.mHasValue) return false;
return lhs > rhs; return lhs > rhs.mValue;
} }
public static bool operator><TOther>(Nullable<T> lhs, Nullable<TOther> rhs) where bool : operator T > TOther where TOther : struct public static bool operator><TOther>(Nullable<T> lhs, Nullable<TOther> rhs) where bool : operator T > TOther where TOther : struct
@ -200,7 +208,7 @@ namespace System
public static bool operator>=<TOther>(TOther lhs, Nullable<T> rhs) where bool : operator TOther >= T public static bool operator>=<TOther>(TOther lhs, Nullable<T> rhs) where bool : operator TOther >= T
{ {
if (!rhs.mHasValue) return false; if (!rhs.mHasValue) return false;
return lhs >= rhs; return lhs >= rhs.mValue;
} }
public static bool operator>=<TOther>(Nullable<T> lhs, Nullable<TOther> rhs) where bool : operator T >= TOther where TOther : struct public static bool operator>=<TOther>(Nullable<T> lhs, Nullable<TOther> rhs) where bool : operator T >= TOther where TOther : struct
@ -218,7 +226,7 @@ namespace System
public static int operator<=><TOther>(TOther lhs, Nullable<T> rhs) where int : operator TOther <=> T public static int operator<=><TOther>(TOther lhs, Nullable<T> rhs) where int : operator TOther <=> T
{ {
return lhs <=> rhs; return lhs <=> rhs.mValue;
} }
public static int operator<=><TOther>(Nullable<T> lhs, Nullable<TOther> rhs) where int : operator T <=> TOther where TOther : struct public static int operator<=><TOther>(Nullable<T> lhs, Nullable<TOther> rhs) where int : operator T <=> TOther where TOther : struct
@ -231,17 +239,17 @@ namespace System
public static TResult? operator+<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T + TOther where TResult : struct public static TResult? operator+<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T + TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue + rhs); return Nullable<TResult>(lhs.mValue + rhs);
} }
public static TResult? operator+<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther + T where TResult : struct public static TResult? operator+<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther + T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs + rhs.mValue); return Nullable<TResult>(lhs + rhs.mValue);
} }
public static TResult? operator+<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T + TOther where TResult : struct public static TResult? operator+<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T + TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue + rhs.mValue); return Nullable<TResult>(lhs.mValue + rhs.mValue);
} }
/// ///
@ -249,19 +257,19 @@ namespace System
public static TResult? operator-<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther - T where TResult : struct public static TResult? operator-<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther - T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs - rhs.mValue); return Nullable<TResult>(lhs - rhs.mValue);
} }
public static TResult? operator-<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T - TOther where TResult : struct public static TResult? operator-<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T - TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue - rhs); return Nullable<TResult>(lhs.mValue - rhs);
} }
public static TResult? operator-<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T - TOther where TResult : struct public static TResult? operator-<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T - TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue - rhs.mValue); return Nullable<TResult>(lhs.mValue - rhs.mValue);
} }
// //
@ -269,19 +277,19 @@ namespace System
public static TResult? operator*<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther * T where TResult : struct public static TResult? operator*<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther * T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs * rhs.mValue); return Nullable<TResult>(lhs * rhs.mValue);
} }
public static TResult? operator*<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T * TOther where TResult : struct public static TResult? operator*<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T * TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue * rhs); return Nullable<TResult>(lhs.mValue * rhs);
} }
public static TResult? operator*<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T * TOther where TResult : struct public static TResult? operator*<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T * TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue * rhs.mValue); return Nullable<TResult>(lhs.mValue * rhs.mValue);
} }
// //
@ -289,19 +297,19 @@ namespace System
public static TResult? operator/<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther / T where TResult : struct public static TResult? operator/<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther / T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs / rhs.mValue); return Nullable<TResult>(lhs / rhs.mValue);
} }
public static TResult? operator/<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T / TOther where TResult : struct public static TResult? operator/<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T / TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue / rhs); return Nullable<TResult>(lhs.mValue / rhs);
} }
public static TResult? operator/<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T / TOther where TResult : struct public static TResult? operator/<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T / TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue / rhs.mValue); return Nullable<TResult>(lhs.mValue / rhs.mValue);
} }
// //
@ -309,19 +317,19 @@ namespace System
public static TResult? operator%<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther % T where TResult : struct public static TResult? operator%<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther % T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs % rhs.mValue); return Nullable<TResult>(lhs % rhs.mValue);
} }
public static TResult? operator%<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T % TOther where TResult : struct public static TResult? operator%<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T % TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue % rhs); return Nullable<TResult>(lhs.mValue % rhs);
} }
public static TResult? operator%<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T % TOther where TResult : struct public static TResult? operator%<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T % TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue % rhs.mValue); return Nullable<TResult>(lhs.mValue % rhs.mValue);
} }
// //
@ -329,19 +337,19 @@ namespace System
public static TResult? operator^<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther ^ T where TResult : struct public static TResult? operator^<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther ^ T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs ^ rhs.mValue); return Nullable<TResult>(lhs ^ rhs.mValue);
} }
public static TResult? operator^<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T ^ TOther where TResult : struct public static TResult? operator^<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T ^ TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue ^ rhs); return Nullable<TResult>(lhs.mValue ^ rhs);
} }
public static TResult? operator^<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T ^ TOther where TResult : struct public static TResult? operator^<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T ^ TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue ^ rhs.mValue); return Nullable<TResult>(lhs.mValue ^ rhs.mValue);
} }
// //
@ -349,19 +357,19 @@ namespace System
public static TResult? operator&<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther & T where TResult : struct public static TResult? operator&<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther & T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs & rhs.mValue); return Nullable<TResult>(lhs & rhs.mValue);
} }
public static TResult? operator&<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T & TOther where TResult : struct public static TResult? operator&<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T & TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue & rhs); return Nullable<TResult>(lhs.mValue & rhs);
} }
public static TResult? operator&<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T & TOther where TResult : struct public static TResult? operator&<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T & TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue & rhs.mValue); return Nullable<TResult>(lhs.mValue & rhs.mValue);
} }
// //
@ -369,39 +377,44 @@ namespace System
public static TResult? operator|<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther | T where TResult : struct public static TResult? operator|<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther | T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs | rhs.mValue); return Nullable<TResult>(lhs | rhs.mValue);
} }
public static TResult? operator|<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T | TOther where TResult : struct public static TResult? operator|<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T | TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue | rhs); return Nullable<TResult>(lhs.mValue | rhs);
} }
public static TResult? operator|<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T | TOther where TResult : struct public static TResult? operator|<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T | TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue | rhs.mValue); return Nullable<TResult>(lhs.mValue | rhs.mValue);
} }
// //
public static T operator??(Nullable<T> lhs, T rhs)
{
return (lhs.mHasValue) ? lhs.mValue : rhs;
}
public static TResult? operator??<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther ?? T where TResult : struct public static TResult? operator??<TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther ?? T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs ?? rhs.mValue); return Nullable<TResult>(lhs ?? rhs.mValue);
} }
public static TResult? operator??<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T ?? TOther where TResult : struct public static TResult? operator??<TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T ?? TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue ?? rhs); return Nullable<TResult>(lhs.mValue ?? rhs);
} }
public static TResult? operator??<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T ?? TOther where TResult : struct public static TResult? operator??<TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T ?? TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue ?? rhs.mValue); return Nullable<TResult>(lhs.mValue ?? rhs.mValue);
} }
// //
@ -409,19 +422,19 @@ namespace System
public static TResult? operator<< <TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther << T where TResult : struct public static TResult? operator<< <TOther, TResult>(TOther lhs, Nullable<T> rhs) where TResult = operator TOther << T where TResult : struct
{ {
if (!rhs.mHasValue) return null; if (!rhs.mHasValue) return null;
return .(lhs << rhs.mValue); return Nullable<TResult>(lhs << rhs.mValue);
} }
public static TResult? operator<< <TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T << TOther where TResult : struct public static TResult? operator<< <TOther, TResult>(Nullable<T> lhs, TOther rhs) where TResult = operator T << TOther where TResult : struct
{ {
if (!lhs.mHasValue) return null; if (!lhs.mHasValue) return null;
return .(lhs.mValue << rhs); return Nullable<TResult>(lhs.mValue << rhs);
} }
public static TResult? operator<< <TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T << TOther where TResult : struct public static TResult? operator<< <TOther, TResult>(Nullable<T> lhs, Nullable<TOther> rhs) where TOther : struct where TResult = operator T << TOther where TResult : struct
{ {
if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null; if ((!lhs.mHasValue) || (!rhs.mHasValue)) return null;
return .(lhs.mValue << rhs.mValue); return Nullable<TResult>(lhs.mValue << rhs.mValue);
} }
} }