Пожалуйста, помогите мне объяснить следующее поведение:
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<dynamic>
, исключений не возникает.
(2) Если я использую неуниверсальный интерфейс с методом, принимающим динамический аргумент, исключение не возникает.
Таким образом, похоже, что эта проблема связана, в частности, с универсальными интерфейсами, но я не смог выяснить, чтоименно вызывает проблему.
Это ошибка в системе компилятора / типов или законное поведение?