private RestrictedArguments GetRestrictedArgs(ApplicableCandidate selectedCandidate, IList<ApplicableCandidate> candidates, int targetSetSize) { Debug.Assert(selectedCandidate.Method.ParameterCount == _actualArguments.Count); int argCount = _actualArguments.Count; var restrictedArgs = new DynamicMetaObject[argCount]; var types = new Type[argCount]; bool hasAdditionalRestrictions = false; for (int i = 0; i < argCount; i++) { var arg = _actualArguments[i]; if (targetSetSize > 0 && IsOverloadedOnParameter(i, argCount, candidates) || !selectedCandidate.GetParameter(i).Type.IsAssignableFrom(arg.Expression.Type)) { restrictedArgs[i] = RestrictArgument(arg, selectedCandidate.GetParameter(i)); types[i] = arg.GetLimitType(); } else { restrictedArgs[i] = arg; } BindingRestrictions additionalRestrictions; if (selectedCandidate.Method.Restrictions != null && selectedCandidate.Method.Restrictions.TryGetValue(arg, out additionalRestrictions)) { hasAdditionalRestrictions = true; restrictedArgs[i] = new DynamicMetaObject(restrictedArgs[i].Expression, restrictedArgs[i].Restrictions.Merge(additionalRestrictions)); } } return new RestrictedArguments(restrictedArgs, types, hasAdditionalRestrictions); }
private Candidate GetPreferredParameters(ApplicableCandidate one, ApplicableCandidate two, NarrowingLevel level) { Debug.Assert(one.Method.ParameterCount == two.Method.ParameterCount); var args = GetActualArguments(); Candidate result = Candidate.Equivalent; for (int i = 0; i < args.Count; i++) { Candidate preferred = GetPreferredParameter(one.GetParameter(i), two.GetParameter(i), args[i], level); switch (result) { case Candidate.Equivalent: result = preferred; break; case Candidate.One: if (preferred == Candidate.Two) return Candidate.Ambiguous; break; case Candidate.Two: if (preferred == Candidate.One) return Candidate.Ambiguous; break; case Candidate.Ambiguous: if (preferred != Candidate.Equivalent) { result = preferred; } break; default: throw new InvalidOperationException(); } } // TODO: process collapsed arguments: return result; }
private RestrictedArguments GetRestrictedArgs(ApplicableCandidate selectedCandidate, IList<ApplicableCandidate> candidates, int targetSetSize) { Debug.Assert(selectedCandidate.Method.ParameterCount == _actualArguments.Count); int argCount = _actualArguments.Count; var restrictedArgs = new DynamicMetaObject[argCount]; var types = new Type[argCount]; for (int i = 0; i < argCount; i++) { var arg = _actualArguments[i]; if (targetSetSize > 0 && IsOverloadedOnParameter(i, argCount, candidates) || !selectedCandidate.GetParameter(i).Type.IsAssignableFrom(arg.Expression.Type)) { restrictedArgs[i] = RestrictArgument(arg, selectedCandidate.GetParameter(i)); types[i] = arg.GetLimitType(); } else { restrictedArgs[i] = arg; } } return new RestrictedArguments(restrictedArgs, types); }