public bool Equals(Value other) { if (Type != other.Type) { if (Type == ValueType.Float && other.Type == ValueType.Int || Type == ValueType.Int && other.Type == ValueType.Float) { return(Float.Equals(other.Float)); } } switch (Type) { case ValueType.Unknown: return(false); case ValueType.Bool: return(Bool == other.Bool); case ValueType.Int: return(Int == other.Int); case ValueType.Float: return(Float == other.Float); case ValueType.Float2: return(Float2.Equals(other.Float2)); case ValueType.Float3: return(Float3.Equals(other.Float3)); case ValueType.Float4: return(Float4.Equals(other.Float4)); case ValueType.Quaternion: return(Quaternion.Equals(other.Quaternion)); case ValueType.Entity: return(Entity == other.Entity); case ValueType.StringReference: return(StringReference.Equals(other.StringReference)); default: throw new ArgumentOutOfRangeException(); } }