2016-06-02 3 views
-1

Это работает:C# вызов ошибки динамический метод

dynamic exp = new List<int>(); 
exp.Add(4); 

, но это не делает:

dynamic exp = new List<int>(); 
exp.Add((object)4); 

RuntimeBinderException: The best overloaded method match for 'System.Collections.Generic.List<int>.Add(int)' has some invalid arguments 

Это пример, но в реальном коде я не знаю типа, но во время выполнения ,

Есть ли способ сделать привязку связующего с типами аргументов экземпляра? и только если они не соответствуют повышению исключения?

+1

exp.Add ((динамический) 4); – Gusman

+0

Почему вы объявляете Список динамическим? вы хотели использовать var? – Richard

+0

@ Гусман не знает, почему я не думал об этом -_-, спасибо! – elios264

ответ

3

Проблема в том, что List<int> является не динамический объект. Он имеет известный тип времени выполнения и содержит int. Объявление переменной как dynamic не меняет это значение. Вы можете добавить только значения int в этот список, иначе вы получите исключение во время выполнения. В вашем конкретном случае List<int>.Add(object) не существует и, следовательно, не работает с исключением связующего.

Поскольку вы не знаете тип во время компиляции, вместо того, чтобы делать переменную dynamic, вместо этого объявите ее IList. Общие списки реализуют интерфейс IList, который содержит IList.Add(object) и может принимать любые типы, разрешенные базовой реализацией (int). Однако вам все равно нужно убедиться, что значения совместимы с этим списком, иначе вы получите исключение аргумента.

Смежные вопросы