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();
            }
        }