<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />

CONSTVAL

sealed class CONSTVAL
using System; using System.Globalization; namespace Microsoft.CSharp.RuntimeBinder.Semantics { internal sealed class CONSTVAL { private object _value; public object objectVal { get { return _value; } set { _value = value; } } public bool boolVal { get { return SpecialUnbox<bool>(_value); } set { _value = SpecialBox(value); } } public sbyte sbyteVal => SpecialUnbox<sbyte>(_value); public byte byteVal => SpecialUnbox<byte>(_value); public short shortVal => SpecialUnbox<short>(_value); public ushort ushortVal => SpecialUnbox<ushort>(_value); public int iVal { get { return SpecialUnbox<int>(_value); } set { _value = SpecialBox(value); } } public uint uiVal { get { return SpecialUnbox<uint>(_value); } set { _value = SpecialBox(value); } } public long longVal { get { return SpecialUnbox<long>(_value); } set { _value = SpecialBox(value); } } public ulong ulongVal { get { return SpecialUnbox<ulong>(_value); } set { _value = SpecialBox(value); } } public float floatVal { get { return SpecialUnbox<float>(_value); } set { _value = SpecialBox(value); } } public double doubleVal { get { return SpecialUnbox<double>(_value); } set { _value = SpecialBox(value); } } public decimal decVal { get { return SpecialUnbox<decimal>(_value); } set { _value = SpecialBox(value); } } public char cVal => SpecialUnbox<char>(_value); public string strVal { get { return SpecialUnbox<string>(_value); } set { _value = SpecialBox(value); } } internal CONSTVAL() : this(null) { } internal CONSTVAL(object value) { _value = value; } public bool IsNullRef() { return _value == null; } public bool IsZero(ConstValKind kind) { switch (kind) { case ConstValKind.Decimal: return decVal == decimal.Zero; case ConstValKind.String: return false; default: return IsDefault(_value); } } private T SpecialUnbox<T>(object o) { if (IsDefault(o)) return default(T); return (T)Convert.ChangeType(o, typeof(T), CultureInfo.InvariantCulture); } private object SpecialBox<T>(T x) { return x; } private bool IsDefault(object o) { if (o != null) { switch (o.GetType().GetTypeCode()) { case TypeCode.Boolean: return false.Equals(o); case TypeCode.SByte: return ((sbyte)0).Equals(o); case TypeCode.Byte: return ((byte)0).Equals(o); case TypeCode.Int16: return ((short)0).Equals(o); case TypeCode.UInt16: return ((ushort)0).Equals(o); case TypeCode.Int32: return 0.Equals(o); case TypeCode.UInt32: return 0.Equals(o); case TypeCode.Int64: return 0.Equals(o); case TypeCode.UInt64: return 0.Equals(o); case TypeCode.Single: return 0.Equals(o); case TypeCode.Double: return 0.Equals(o); case TypeCode.Decimal: return decimal.Zero.Equals(o); case TypeCode.Char: return ''.Equals(o); default: return false; } } return true; } } }