public IOperator RegisterOperator(
            string text,
            int precedence,
            DoubleOperandFunctionMatrix matrix,
            ShortCircuitMode shortCircuit = ShortCircuitMode.None,
            OperatorType operatorType     = OperatorType.Operator)
        {
            var op = new Operator(operatorType,
                                  precedence,
                                  shortCircuit,
                                  (operandStack, vSet, parserPosition) =>
            {
                var result = OperatorActions.DoOperation(matrix, operandStack, vSet);
                if (result != null)
                {
                    throw new ExpressionEvaluatorException(
                        parserPosition,
                        ExpressionEvaluatorException.ExceptionCause.BadOperand,
                        "Operator '" + text + "' cannot be applied to operands of type " + result.Item1 + " and " + result.Item2);
                }
            }, text
                                  );

            Operators.Add(text, op);
            OperatorMatrices.Add(op, matrix);
            return(op);
        }
        public static DoubleOperandFunctionMatrix Create()
        {
            var matrix = new DoubleOperandFunctionMatrix();

            matrix.RegisterDelegate(OperandType.Bool, OperandType.Bool, (leftOperand, rightOperand) => new Operand(OperandType.Bool, (bool)leftOperand.GetValue() && (bool)rightOperand.GetValue()));

            return(matrix);
        }
        internal static Tuple <OperandType> DoUnaryCastOperation(DoubleOperandFunctionMatrix matrix, Stack <IOperand> operandStack, IBackingStore backingStore, Operand castTo)
        {
            IOperand operand = PopAndResolve(operandStack, backingStore);

            IOperand result = matrix.PerformDelegate(operand, castTo);

            if (result != null)
            {
                operandStack.Push(result);
                return(null);
            }
            else
            {
                // Signal an error ...
                return(new Tuple <OperandType>(operand.Type));
            }
        }
        public IOperator RegisterSetEqualsOperator(string text, int precedence, DoubleOperandFunctionMatrix matrix)
        {
            var op = new Operator(OperatorType.Operator, precedence, ShortCircuitMode.None,

                                  (operandStack, vSet, parserPosition) =>
            {
                var result = OperatorActions.DoSetEquals(matrix, operandStack, vSet, parserPosition);
                // DoSetEquals throws its own exception.
            }


                                  , text);

            Operators.Add(text, op);
            OperatorMatrices.Add(op, matrix);
            return(op);
        }
        internal static Tuple <OperandType, OperandType> DoOperation(DoubleOperandFunctionMatrix matrix, Stack <IOperand> stack, IBackingStore backingStore)
        {
            IOperand second = PopAndResolve(stack, backingStore);
            IOperand first  = PopAndResolve(stack, backingStore);

            IOperand result = matrix.PerformDelegate(first, second);

            if (result != null)
            {
                stack.Push(result);
                return(null);
            }
            else
            {
                // Signal an error ...
                return(new Tuple <OperandType, OperandType>(first.Type, second.Type));
            }
        }
        /// <summary>
        /// This ought to be implemented with a FunctionMartix but it would be huge.
        /// This way is easier!
        /// </summary>
        internal static Tuple <OperandType, OperandType> DoSetEquals(DoubleOperandFunctionMatrix matrix, Stack <IOperand> stack, IBackingStore backingStore, long parserPosition)
        {
            IOperand second = PopAndResolve(stack, backingStore);
            IOperand first  = stack.Pop();      // Not PopAndResolve. LHS must be a variable.

            if (first.Type != OperandType.Variable)
            {
                throw new ExpressionEvaluatorException(parserPosition, ExpressionEvaluatorException.ExceptionCause.BadOperand, "LHS of '=' is a '" + first.Type + "' when it must be a variable");
            }
            else
            {
                string varName = (string)first.GetValue();

                (OperandType type, object value)valueAndType;
                try
                {
                    // We need the type, don't need the value because it's going to be overwritten.
                    valueAndType = backingStore.GetValue(varName);
                }
                catch (Exception ex)
                {
                    throw new ExpressionEvaluatorException(-1, ExpressionEvaluatorException.ExceptionCause.UndefinedVariable, $"'{varName}'");
                }

                // type is needed so we can pick out the correct martrix operation. Value is irrelevant as it is overwritten.
                var firstOperand = new Operand(first.ParserPosition, valueAndType.type, valueAndType.value);

                IOperand result = matrix.PerformDelegate(firstOperand, second);

                if (result != null)
                {
                    backingStore.SetValue(varName, result.GetValue());
                    stack.Push(result);
                    return(null);
                }
                else
                {
                    // Signal an error ...
                    return(new Tuple <OperandType, OperandType>(first.Type, second.Type));
                }
            }
        }
        public IOperator RegisterUnaryCastOperator(OperandType operandType, int precedence, DoubleOperandFunctionMatrix matrix)
        {
            var text = operandType.ToString();

            var castToOperand = new Operand(operandType);

            var op = new Operator(
                OperatorType.UnaryCastOperator,
                precedence,
                ShortCircuitMode.None,
                (operandStack, vSet, parserPosition) =>
            {
                var result = OperatorActions.DoUnaryCastOperation(matrix, operandStack, vSet, castToOperand);
                if (result != null)
                {
                    throw new ExpressionEvaluatorException(parserPosition,
                                                           ExpressionEvaluatorException.ExceptionCause.BadUnaryOperand,
                                                           "Cast to (" + text + ") cannot be applied to operand of type " + result.Item1);
                }
            },
                text
                );

            Operators.Add(text, op);
            OperatorMatrices.Add(op, matrix);
            return(op);
        }
        public static DoubleOperandFunctionMatrix Create()
        {
            var matrix = new DoubleOperandFunctionMatrix();

            matrix.RegisterDelegate(OperandType.Sbyte, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.Sbyte, (sbyte)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Byte, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.Byte, (byte)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Short, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.Short, (short)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Short, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.Short, (short)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Short, OperandType.Short, (leftOperand, rightOperand) => new Operand(OperandType.Short, (short)(short)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Ushort, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.Ushort, (ushort)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Ushort, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.Ushort, (ushort)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Ushort, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.Ushort, (ushort)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Int, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.Int, (int)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Int, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.Int, (int)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Int, OperandType.Short, (leftOperand, rightOperand) => new Operand(OperandType.Int, (int)(short)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Int, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.Int, (int)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Int, OperandType.Int, (leftOperand, rightOperand) => new Operand(OperandType.Int, (int)(int)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Int, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.Int, (int)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Uint, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.Uint, (uint)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Uint, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.Uint, (uint)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Uint, OperandType.Uint, (leftOperand, rightOperand) => new Operand(OperandType.Uint, (uint)(uint)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Uint, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.Uint, (uint)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Long, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.Long, (long)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Long, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.Long, (long)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Long, OperandType.Short, (leftOperand, rightOperand) => new Operand(OperandType.Long, (long)(short)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Long, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.Long, (long)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Long, OperandType.Int, (leftOperand, rightOperand) => new Operand(OperandType.Long, (long)(int)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Long, OperandType.Uint, (leftOperand, rightOperand) => new Operand(OperandType.Long, (long)(uint)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Long, OperandType.Long, (leftOperand, rightOperand) => new Operand(OperandType.Long, (long)(long)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Long, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.Long, (long)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Ulong, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.Ulong, (ulong)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Ulong, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.Ulong, (ulong)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Ulong, OperandType.Uint, (leftOperand, rightOperand) => new Operand(OperandType.Ulong, (ulong)(uint)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Ulong, OperandType.Ulong, (leftOperand, rightOperand) => new Operand(OperandType.Ulong, (ulong)(ulong)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Ulong, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.Ulong, (ulong)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Char, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.Char, (char)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Float, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.Float, (float)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Float, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.Float, (float)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Float, OperandType.Short, (leftOperand, rightOperand) => new Operand(OperandType.Float, (float)(short)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Float, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.Float, (float)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Float, OperandType.Int, (leftOperand, rightOperand) => new Operand(OperandType.Float, (float)(int)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Float, OperandType.Uint, (leftOperand, rightOperand) => new Operand(OperandType.Float, (float)(uint)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Float, OperandType.Long, (leftOperand, rightOperand) => new Operand(OperandType.Float, (float)(long)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Float, OperandType.Ulong, (leftOperand, rightOperand) => new Operand(OperandType.Float, (float)(ulong)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Float, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.Float, (float)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Float, OperandType.Float, (leftOperand, rightOperand) => new Operand(OperandType.Float, (float)(float)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Double, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.Double, (double)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Double, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.Double, (double)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Double, OperandType.Short, (leftOperand, rightOperand) => new Operand(OperandType.Double, (double)(short)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Double, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.Double, (double)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Double, OperandType.Int, (leftOperand, rightOperand) => new Operand(OperandType.Double, (double)(int)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Double, OperandType.Uint, (leftOperand, rightOperand) => new Operand(OperandType.Double, (double)(uint)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Double, OperandType.Long, (leftOperand, rightOperand) => new Operand(OperandType.Double, (double)(long)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Double, OperandType.Ulong, (leftOperand, rightOperand) => new Operand(OperandType.Double, (double)(ulong)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Double, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.Double, (double)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Double, OperandType.Float, (leftOperand, rightOperand) => new Operand(OperandType.Double, (double)(float)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Double, OperandType.Double, (leftOperand, rightOperand) => new Operand(OperandType.Double, (double)(double)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Bool, OperandType.Bool, (leftOperand, rightOperand) => new Operand(OperandType.Bool, (bool)(bool)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Decimal, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.Decimal, (decimal)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Decimal, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.Decimal, (decimal)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Decimal, OperandType.Short, (leftOperand, rightOperand) => new Operand(OperandType.Decimal, (decimal)(short)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Decimal, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.Decimal, (decimal)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Decimal, OperandType.Int, (leftOperand, rightOperand) => new Operand(OperandType.Decimal, (decimal)(int)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Decimal, OperandType.Uint, (leftOperand, rightOperand) => new Operand(OperandType.Decimal, (decimal)(uint)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Decimal, OperandType.Long, (leftOperand, rightOperand) => new Operand(OperandType.Decimal, (decimal)(long)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Decimal, OperandType.Ulong, (leftOperand, rightOperand) => new Operand(OperandType.Decimal, (decimal)(ulong)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Decimal, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.Decimal, (decimal)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Decimal, OperandType.Decimal, (leftOperand, rightOperand) => new Operand(OperandType.Decimal, (decimal)(decimal)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableSbyte, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.NullableSbyte, (sbyte?)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableSbyte, OperandType.NullableSbyte, (leftOperand, rightOperand) => new Operand(OperandType.NullableSbyte, (sbyte?)(sbyte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableSbyte, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.NullableSbyte, (sbyte?)null));
            matrix.RegisterDelegate(OperandType.NullableByte, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.NullableByte, (byte?)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableByte, OperandType.NullableByte, (leftOperand, rightOperand) => new Operand(OperandType.NullableByte, (byte?)(byte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableByte, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.NullableByte, (byte?)null));
            matrix.RegisterDelegate(OperandType.NullableShort, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.NullableShort, (short?)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableShort, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.NullableShort, (short?)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableShort, OperandType.Short, (leftOperand, rightOperand) => new Operand(OperandType.NullableShort, (short?)(short)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableShort, OperandType.NullableSbyte, (leftOperand, rightOperand) => new Operand(OperandType.NullableShort, (short?)(sbyte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableShort, OperandType.NullableByte, (leftOperand, rightOperand) => new Operand(OperandType.NullableShort, (short?)(byte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableShort, OperandType.NullableShort, (leftOperand, rightOperand) => new Operand(OperandType.NullableShort, (short?)(short?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableShort, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.NullableShort, (short?)null));
            matrix.RegisterDelegate(OperandType.NullableUshort, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.NullableUshort, (ushort?)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUshort, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.NullableUshort, (ushort?)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUshort, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.NullableUshort, (ushort?)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUshort, OperandType.NullableByte, (leftOperand, rightOperand) => new Operand(OperandType.NullableUshort, (ushort?)(byte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUshort, OperandType.NullableUshort, (leftOperand, rightOperand) => new Operand(OperandType.NullableUshort, (ushort?)(ushort?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUshort, OperandType.NullableChar, (leftOperand, rightOperand) => new Operand(OperandType.NullableUshort, (ushort?)(char?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUshort, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.NullableUshort, (ushort?)null));
            matrix.RegisterDelegate(OperandType.NullableInt, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.NullableInt, (int?)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableInt, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.NullableInt, (int?)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableInt, OperandType.Short, (leftOperand, rightOperand) => new Operand(OperandType.NullableInt, (int?)(short)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableInt, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.NullableInt, (int?)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableInt, OperandType.Int, (leftOperand, rightOperand) => new Operand(OperandType.NullableInt, (int?)(int)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableInt, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.NullableInt, (int?)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableInt, OperandType.NullableSbyte, (leftOperand, rightOperand) => new Operand(OperandType.NullableInt, (int?)(sbyte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableInt, OperandType.NullableByte, (leftOperand, rightOperand) => new Operand(OperandType.NullableInt, (int?)(byte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableInt, OperandType.NullableShort, (leftOperand, rightOperand) => new Operand(OperandType.NullableInt, (int?)(short?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableInt, OperandType.NullableUshort, (leftOperand, rightOperand) => new Operand(OperandType.NullableInt, (int?)(ushort?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableInt, OperandType.NullableInt, (leftOperand, rightOperand) => new Operand(OperandType.NullableInt, (int?)(int?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableInt, OperandType.NullableChar, (leftOperand, rightOperand) => new Operand(OperandType.NullableInt, (int?)(char?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableInt, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.NullableInt, (int?)null));
            matrix.RegisterDelegate(OperandType.NullableUint, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.NullableUint, (uint?)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUint, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.NullableUint, (uint?)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUint, OperandType.Uint, (leftOperand, rightOperand) => new Operand(OperandType.NullableUint, (uint?)(uint)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUint, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.NullableUint, (uint?)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUint, OperandType.NullableByte, (leftOperand, rightOperand) => new Operand(OperandType.NullableUint, (uint?)(byte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUint, OperandType.NullableUshort, (leftOperand, rightOperand) => new Operand(OperandType.NullableUint, (uint?)(ushort?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUint, OperandType.NullableUint, (leftOperand, rightOperand) => new Operand(OperandType.NullableUint, (uint?)(uint?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUint, OperandType.NullableChar, (leftOperand, rightOperand) => new Operand(OperandType.NullableUint, (uint?)(char?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUint, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.NullableUint, (uint?)null));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.Short, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(short)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.Int, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(int)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.Uint, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(uint)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.Long, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(long)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.NullableSbyte, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(sbyte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.NullableByte, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(byte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.NullableShort, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(short?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.NullableUshort, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(ushort?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.NullableInt, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(int?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.NullableUint, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(uint?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.NullableLong, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(long?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.NullableChar, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)(char?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableLong, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.NullableLong, (long?)null));
            matrix.RegisterDelegate(OperandType.NullableUlong, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.NullableUlong, (ulong?)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUlong, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.NullableUlong, (ulong?)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUlong, OperandType.Uint, (leftOperand, rightOperand) => new Operand(OperandType.NullableUlong, (ulong?)(uint)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUlong, OperandType.Ulong, (leftOperand, rightOperand) => new Operand(OperandType.NullableUlong, (ulong?)(ulong)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUlong, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.NullableUlong, (ulong?)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUlong, OperandType.NullableByte, (leftOperand, rightOperand) => new Operand(OperandType.NullableUlong, (ulong?)(byte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUlong, OperandType.NullableUshort, (leftOperand, rightOperand) => new Operand(OperandType.NullableUlong, (ulong?)(ushort?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUlong, OperandType.NullableUint, (leftOperand, rightOperand) => new Operand(OperandType.NullableUlong, (ulong?)(uint?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUlong, OperandType.NullableUlong, (leftOperand, rightOperand) => new Operand(OperandType.NullableUlong, (ulong?)(ulong?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUlong, OperandType.NullableChar, (leftOperand, rightOperand) => new Operand(OperandType.NullableUlong, (ulong?)(char?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableUlong, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.NullableUlong, (ulong?)null));
            matrix.RegisterDelegate(OperandType.NullableChar, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.NullableChar, (char?)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableChar, OperandType.NullableChar, (leftOperand, rightOperand) => new Operand(OperandType.NullableChar, (char?)(char?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableChar, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.NullableChar, (char?)null));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.Short, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(short)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.Int, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(int)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.Uint, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(uint)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.Long, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(long)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.Ulong, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(ulong)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.Float, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(float)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.NullableSbyte, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(sbyte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.NullableByte, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(byte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.NullableShort, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(short?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.NullableUshort, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(ushort?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.NullableInt, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(int?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.NullableUint, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(uint?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.NullableLong, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(long?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.NullableUlong, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(ulong?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.NullableChar, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(char?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.NullableFloat, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)(float?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableFloat, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.NullableFloat, (float?)null));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.Short, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(short)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.Int, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(int)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.Uint, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(uint)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.Long, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(long)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.Ulong, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(ulong)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.Float, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(float)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.Double, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(double)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.NullableSbyte, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(sbyte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.NullableByte, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(byte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.NullableShort, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(short?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.NullableUshort, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(ushort?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.NullableInt, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(int?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.NullableUint, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(uint?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.NullableLong, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(long?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.NullableUlong, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(ulong?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.NullableChar, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(char?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.NullableFloat, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(float?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.NullableDouble, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)(double?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDouble, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.NullableDouble, (double?)null));
            matrix.RegisterDelegate(OperandType.NullableBool, OperandType.Bool, (leftOperand, rightOperand) => new Operand(OperandType.NullableBool, (bool?)(bool)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableBool, OperandType.NullableBool, (leftOperand, rightOperand) => new Operand(OperandType.NullableBool, (bool?)(bool?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableBool, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.NullableBool, (bool?)null));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.Short, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(short)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.Int, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(int)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.Uint, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(uint)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.Long, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(long)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.Ulong, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(ulong)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.Decimal, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(decimal)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.NullableSbyte, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(sbyte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.NullableByte, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(byte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.NullableShort, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(short?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.NullableUshort, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(ushort?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.NullableInt, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(int?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.NullableUint, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(uint?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.NullableLong, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(long?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.NullableUlong, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(ulong?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.NullableChar, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(char?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.NullableDecimal, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)(decimal?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.NullableDecimal, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.NullableDecimal, (decimal?)null));
            matrix.RegisterDelegate(OperandType.String, OperandType.String, (leftOperand, rightOperand) => new Operand(OperandType.String, (string)(string)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.String, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.String, (string)null));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Sbyte, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(sbyte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Byte, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(byte)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Short, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(short)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Ushort, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(ushort)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Int, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(int)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Uint, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(uint)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Long, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(long)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Ulong, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(ulong)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Char, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(char)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Float, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(float)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Double, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(double)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Bool, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(bool)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Decimal, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(decimal)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.NullableSbyte, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(sbyte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.NullableByte, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(byte?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.NullableShort, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(short?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.NullableUshort, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(ushort?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.NullableInt, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(int?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.NullableUint, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(uint?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.NullableLong, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(long?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.NullableUlong, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(ulong?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.NullableChar, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(char?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.NullableFloat, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(float?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.NullableDouble, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(double?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.NullableBool, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(bool?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.NullableDecimal, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(decimal?)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.String, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(string)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Object, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)(object)rightOperand.GetValue()));
            matrix.RegisterDelegate(OperandType.Object, OperandType.Null, (leftOperand, rightOperand) => new Operand(OperandType.Object, (object)null));

            return(matrix);
        }