This completely surprised me: bool doMatch(int[] lhsArr, int[][] arrArr) { foreach (int[] rhsArr; arrArr) { writeln("if (!doMatch(lhsArr, arrArr))");
if (!.doMatch(lhsArr, arrArr)) return false; } return true; } bool doMatch(int[] lhsArr, int[] rhsArr) { return true; } void main() { int[] x = [1, 2]; int[][] y = [[1, 2], [1, 2]]; bool b = doMatch(x, y); } This will enter an infinite loop because the first doMatch overload gets recursively called. I don't understand why the second overload isn't picked up as a match in the call "doMatch(lhsArr, arrArr)".