private int BetterCandidate(Candidate c1, Candidate c2) { if (c1 == c2) { return(0); } int result = Math.Sign(TotalScore(c1) - TotalScore(c2)); if (result != 0) { return(result); } // Prefer methods declared on deeper types result = c1.Method.DeclaringType.GetTypeDepth() - c2.Method.DeclaringType.GetTypeDepth(); if (result != 0) { return(result); } // Prefer methods with less generic parameters result = GenericsServices.GetMethodGenerity(c2.Method) - GenericsServices.GetMethodGenerity(c1.Method); if (result != 0) { return(result); } // --- Tie breaking mode! --- // Non-expanded methods are better than expanded ones if (!c1.Expanded && c2.Expanded) { return(1); } if (c1.Expanded && !c2.Expanded) { return(-1); } // An expanded method with more fixed parameters is better result = c1.Parameters.Length - c2.Parameters.Length; if (result != 0) { return(result); } // As a last means of breaking this desperate tie, we select the // "more specific" candidate, if one exists return(MoreSpecific(c1, c2)); }