private EvaluatedExpression GetArrayElement(EvaluatedExpression array, EvaluatedExpression index)
        {
            Contract.Requires <ArgumentNullException>(array != null, "array");
            Contract.Requires <ArgumentNullException>(index != null, "index");
            Contract.Ensures(Contract.Result <EvaluatedExpression>() != null);

            IArrayReference arrayReference = array.Value as IArrayReference;

            if (arrayReference == null)
            {
                throw new InvalidOperationException();
            }

            long indexValue;

            if (TryGetIntegralValue(index.Value, out indexValue))
            {
                string           name            = string.Format("[{0}]", indexValue);
                string           fullName        = string.Format("({0})[{1}]", array.FullName, index.FullName);
                ILocalVariable   localVariable   = array.LocalVariable;
                IObjectReference referencer      = array.Value as IObjectReference;
                IField           field           = array.Field;
                IMethod          method          = null;
                IValue           value           = arrayReference.GetValue((int)indexValue);
                IType            valueType       = ((IArrayType)arrayReference.GetReferenceType()).GetComponentType();
                bool             strongReference = false;
                return(new EvaluatedExpression(name, fullName, localVariable, referencer, field, method, (int)indexValue, value, valueType, strongReference, array.HasSideEffects || index.HasSideEffects));
            }

            throw new InvalidOperationException();
        }