/// <summary> /// Throws an exception if an index expression is not valid for subscripting an array. /// </summary> /// <param name="index">Index expression</param> /// <param name="array">Array that the expression is indexing</param> /// <exclude/> internal void CheckCompatible(IModelExpression index, IVariableArray array) { if (IsCompatibleWith(index)) { return; } string message = StringUtil.TypeToString(array.GetType()) + " " + array + " cannot be indexed by " + index + "."; if (index is Range) { string constructorName = "the constructor"; message += " Perhaps you omitted " + index + " as an argument to " + constructorName + "?"; } throw new ArgumentException(message, "index"); }
private static IModelExpression ReplaceExpressions(IModelExpression expr, Dictionary <IModelExpression, IModelExpression> replacements) { if (replacements.ContainsKey(expr)) { return(replacements[expr]); } if (expr is Range) { return(ReplaceExpressions((Range)expr, replacements)); } else if (expr is Variable) { Variable v = (Variable)expr; if (v.IsArrayElement) { bool changed = false; IVariableArray newArray = (IVariableArray)ReplaceExpressions(v.ArrayVariable, replacements); if (!ReferenceEquals(newArray, v.ArrayVariable)) { changed = true; } IModelExpression[] newIndices = new IModelExpression[v.indices.Count]; for (int i = 0; i < newIndices.Length; i++) { newIndices[i] = ReplaceExpressions(v.indices[i], replacements); if (!ReferenceEquals(newIndices[i], v.indices[i])) { changed = true; } } if (changed) { return ((IModelExpression) Invoker.InvokeMember(newArray.GetType(), "get_Item", BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, newArray, newIndices)); } } } return(expr); }