У меня возникли проблемы с использованием динамических переменных в C#. Это возникло при кодировании модулей маршрутизации NancyFx, но я рассмотрел проблему ниже. Хотя в исходном коде я получил другое исключение, код примера по-прежнему вызывает исключение, которое, по моему мнению, ошибочно. Кто-нибудь видит, что здесь происходит, или другие сталкиваются с подобными проблемами?Возможная ошибка в C# dynamic?
Обратите внимание, что могут быть связаны следующие сообщения: StackOverflowException when accessing member of generic type via dynamic: .NET/C# framework bug? System.Dynamic bug?
Код:
class Program
{
static void Main(string[] args)
{
var dictionary = new Dictionary<string, object>();
dictionary.Add("number", 12);
var result = MethodUsesExplicitDeclaration(dictionary);
var result2 = MethodUsesImplicitDeclaration(dictionary);
}
static dynamic MethodUsesExplicitDeclaration(dynamic reallyDictionary)
{
// this works, ostensibly because the local variable is explicitly declared
IDictionary<string, object> dictionary = CastDictionary(reallyDictionary);
return dictionary.Get<int>("number");
}
static dynamic MethodUsesImplicitDeclaration(dynamic reallyDictionary)
{
// this throws an exception, and the only difference is
// that the variable declaration is implicit
var dictionary = CastDictionary(reallyDictionary);
return dictionary.Get<int>("number");
}
static IDictionary<string, object> CastDictionary(dynamic arg)
{
return arg as IDictionary<string, object>;
}
}
static class Extensions
{
public static T Get<T>(this IDictionary<string, object> dictionary, string key)
{
var value = dictionary[key];
if (value is T)
return (T)value;
throw new InvalidOperationException();
}
}
Исключение: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException was unhandled HResult=-2146233088 Message='System.Collections.Generic.Dictionary<string,object>' does not contain a definition for 'Get' Source=Anonymously Hosted DynamicMethods Assembly StackTrace: at CallSite.Target(Closure , CallSite , Object , String) at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1) at DynamicBug.Program.MethodUsesImplicitDeclaration(Object reallyDictionary) in c:\TFS\UnreleasedCode\POC\DynamicBug\DynamicBug\Program.cs:line 28 at DynamicBug.Program.Main(String[] args) in c:\TFS\UnreleasedCode\POC\DynamicBug\DynamicBug\Program.cs:line 16 InnerException:
Похоже, что на этот вопрос будет дан ответ [здесь] (http://stackoverflow.com/a/258999/97382). –
Я не считаю, что http://stackoverflow.com/questions/258988/will-the-dynamic-keyword-in-c4-support-extension-methods обращается к одному и тому же вопросу. Код примера не пытается использовать метод расширения для переменной, объявленной как динамический, она использует ее в результате метода, который возвращает тип интерфейса. Поэтому в обеих версиях метода, который выполняет метод расширения, тип, к которому применяется метод расширения, не является динамическим. –
Другой способ, которым я мог задать исходный вопрос, - это когда объявление переменной var var должно вести себя как тип значения, которое вы ему назначили? –