我在使用C#中的动态变量时遇到了问题。这是在编写NancyFx路由模块时出现的,但我已经将问题简化为下面的示例。虽然在原始代码中我收到了不同的异常,但示例代码仍会抛出异常,我认为这是错误的。有人看到这里发生了什么,或者有其他人遇到过类似的问题吗?
请注意,以下帖子可能与此有关: 通过dynamic访问泛型类型的成员时引发StackOverflowException:.NET / C#框架错误? System.Dynamic bug? 代码如下:
异常情况:
请注意,以下帖子可能与此有关: 通过dynamic访问泛型类型的成员时引发StackOverflowException:.NET / C#框架错误? 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
未处理
HResult=-2146233088
消息='System.Collections.Generic.Dictionary<string,object>'不包含 'Get' 的定义
来源=匿名托管动态方法程序集
堆栈跟踪:
在 CallSite.Target(Closure , CallSite , Object , String )
在 System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
在 DynamicBug.Program.MethodUsesImplicitDeclaration(Object reallyDictionary) in c:\TFS\UnreleasedCode\POC\DynamicBug\DynamicBug\Program.cs:line 28
在 DynamicBug.Program.Main(String[] args) in c:\TFS\UnreleasedCode\POC\DynamicBug\DynamicBug\Program.cs:line 16
内部异常:
var
变量声明不应该像您分配给它的值类型那样行为? - Jason MowryGet
不存在。Get
是一个扩展方法。 看起来它应该适用。 如果您将该行更改为return Extensions.Get<int>(dictionary, "number");
,则可以按预期执行。 - Craig W.