internal static bool HasMatch(CallMatchResult r)
 {
     switch (r)
     {
         case CallMatchResult.PerfectMatch: return true;
         case CallMatchResult.ConvertMatch: return true;
         case CallMatchResult.AmbiguityMatch: return true;
         default: return false;
     }
 }
 internal static int GetMatchPriority(CallMatchResult r)
 {
     switch (r)
     {
         case CallMatchResult.Unknown: return 10;
         case CallMatchResult.PerfectMatch: return 9;
         case CallMatchResult.ConvertMatch: return 8;
         case CallMatchResult.AmbiguityMatch: return 7;
         case CallMatchResult.UnmatchArgumentType: return 4;
         case CallMatchResult.UnmatchArgumentCount: return 3;
         case CallMatchResult.UnmatchGenericType: return 2;
         case CallMatchResult.UnmatchGenericCount: return 1;
         case CallMatchResult.NotCallable: return 0;
         default: throw new ArgumentException("r");
     }
 }