Мне кажется, я понял проблему; у вас возникают проблемы при вызове универсального делегата из непосредственного окна, когда тип времени компиляции делегата является открытым универсальным типом.
Вот более простое воспроизведение:
static void Main() { Test<double>(); }
static void Test<T>()
{
Action<T> genericDel = delegate { };
// Place break-point here.
}
Теперь, если я попытаюсь выполнить этот делегат из метода Test
(установив точку останова и используя непосредственное окно), вот так:
genericDel(42D);
Я получаю следующую ошибку:
Delegate 'System.Action<T>' has some invalid arguments
Обратите внимание, что это не исключение, как вы заявили, а скорее "немедленная версия окна" ошибка времени компиляции CS1594 .
Обратите внимание, что такой вызов потерпел бы неудачу в равной степени во время компиляции, потому что нет явного или явного преобразования из double
в T
.
Это 1028 * спорный * недостаток непосредственного окна (это не кажется, готовы использовать дополнительное «время выполнения знания», чтобы помочь вам в этом случае), но можно утверждать, что это разумное поведение, поскольку эквивалентный вызов, выполняемый во время компиляции (в исходном коде), также был бы недопустимым. Это похоже на угловой случай; непосредственное окно вполне может назначать универсальные переменные и выполнять другой код, который был бы недопустим во время компиляции. Возможно, Рослин сделает вещи намного более последовательными.
Если вы хотите, вы можете обойти это так:
genericDel.DynamicInvoke(42D);
(или)
((Action<double>)(object)genericDel)(42D);