// // System.Nullable // // Martin Baulig (martin@ximian.com) // // (C) 2004 Novell, Inc. // // // Copyright (C) 2004 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.Reflection; #if NET_2_0 using System.Collections.Generic; #endif using System.Runtime.CompilerServices; #if NET_2_0 namespace System { public static class Nullable { public static int Compare (Nullable left, Nullable right) { IComparable icomparable = left.value as IComparable; if (icomparable == null) throw new ArgumentException ("At least one object must implement IComparable."); if (left.has_value == false && right.has_value == false) return 0; if (!left.has_value) return -1; if (!right.has_value) return 1; return icomparable.CompareTo (right.value); } public static bool Equals (Nullable value1, Nullable value2) { return value1.Equals (value2); } public static Nullable FromObject (object value) { if (!(value is T)) throw new ArgumentException ("Object type can not be converted to target type."); return new Nullable ((T) value); } public static T GetValueOrDefault(Nullable value) { return GetValueOrDefault (value, default (T)); } public static T GetValueOrDefault (Nullable value, T defaultValue) { if (!value.has_value) return defaultValue; return value.value; } public static bool HasValue (Nullable value) { return value.has_value; } public static object ToObject (Nullable value) { if (!value.has_value) return null; return (object)value.value; } } public struct Nullable : IComparable, INullableValue { internal T value; internal bool has_value; public Nullable (T value) { if (value == null) this.has_value = false; else this.has_value = true; this.value = value; } public bool HasValue { get { return has_value; } } public T Value { get { if (!has_value) throw new InvalidOperationException ("Nullable object must have a value."); return value; } } object INullableValue.Value { get { return (object)Value; } } [Obsolete] public int CompareTo (Nullable other) { return Nullable.Compare (this, other); } [Obsolete] public int CompareTo (object other) { if (!(other is Nullable)) throw new ArgumentException ("Object type can not be converted to target type."); return Nullable.Compare (this, (Nullable) other); } public override bool Equals (object other) { if (!(other is Nullable)) return false; return Equals ((Nullable ) other); } public bool Equals (Nullable other) { if (other.has_value != has_value) return false; if (has_value == false) return true; return other.value.Equals (value); } [Obsolete] public static Nullable FromObject (object value) { return Nullable.FromObject (value); } public override int GetHashCode () { if (!has_value) return 0; return value.GetHashCode (); } [Obsolete] public T GetValueOrDefault () { return Nullable.GetValueOrDefault (this, default (T)); } [Obsolete] public T GetValueOrDefault (T def_value) { return Nullable.GetValueOrDefault (this, def_value); } public object ToObject () { if (!has_value) return null; return (object)value; } public override string ToString () { if (has_value) return value.ToString (); else return ""; } public static implicit operator Nullable (T value) { return new Nullable (value); } public static explicit operator T (Nullable value) { return value.Value; } public static bool operator == (Nullable left, Nullable right) { return left.Equals (right); } public static bool operator != (Nullable left, Nullable right) { return !left.Equals (right); } } } #endif