Пример #1
0
        /// <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");
        }
Пример #2
0
 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);
 }