Почему вызов ISet .Contains () компилируется, но выдает исключение во время выполнения?

Пожалуйста, помогите мне объяснить следующее поведение:

dynamic d = 1;
ISet<dynamic> s = new HashSet<dynamic>();
s.Contains(d);

Код компилируется без ошибок / предупреждений, но в последней строке я получаю сообщение следующее исключение:

Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.Collections.Generic.ISet<object>' does not contain a definition for 'Contains'
   at CallSite.Target(Closure , CallSite , ISet`1 , Object )
   at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite site, T0 arg0, T1 arg1)
   at FormulaToSimulation.Program.Main(String[] args) in 

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

(1) Если тип s - HashSet , нет возникает исключение.

(2) Если я использую неуниверсальный интерфейс с методом, принимающим динамический аргумент, исключение не возникает.

Таким образом, похоже, что эта проблема связана, в частности, с универсальными интерфейсами, но я не мог выяснить, что именно вызывает проблему.

Это ошибка в компиляторе / системе типов, или законное поведение?

22
задан Oded 12 September 2010 в 18:55
поделиться