Если у вас есть:

F(G<A,B>(5));

Опция 1

Означает ли это, что пользователь хочет вызвать метод F с двумя параметрами, полученными в результате сравнения G и A, а также B и константы 5?

Вариант 2

Или это означает вызов F с результатом вызова универсального метода G с параметрами типа A и B и аргументом 5?

Чтобы проверить это, были использованы два сегмента кода, тот, что ниже, компилируется без ошибок:

Однако приведенный ниже код выдает ошибки:

Ошибки:

1. Не удалось найти имя типа или пространства имен «A» (вам не хватает директивы using или ссылки на сборку?)

2. Не удалось найти имя типа или пространства имен «B» (вам не хватает директивы using или ссылки на сборку?)

3. Переменная «G» не является универсальным методом. Если вы намеревались составить список выражений, используйте круглые скобки вокруг выражения ‹.

Получается, что выражение интерпретируется как общий вызов функции.

Вы можете заставить компилятор рассматривать это как один вызов функции с двумя параметрами, используя квадратные скобки для первого аргумента или вообще без скобок:

F((G<A), B>(5)); or F(G<A, B>5)

Прочтите раздел 7.6.4.2 Спецификации C# для получения дополнительной информации.