C#4.0'dynamic'doesnotsetref/outparameters我尝试做的一件事是设置ref/out参数的值,如下面的代码所示。但是,我无法正确设置Main()的i和j值(即使它们在TryInvokeMember()中设置正确)。有谁知道如何使用ref/out参数调用DynamicObject对象并能够检索方法中设置的值?类程序{staticvoidMain(string[]args){动态代理=newProxy(newTarget());诠释我=10;整数j=20;proxy.Wrap(refi,refj);Console.WriteLine(i+":"+j);//打印“10:20”,期望“20:10”}}classProxy:DynamicObject{privatereadonlyTargettarget;公共代理(目标目标){这个。目标=目标;}publicoverrideboolTryInvokeMember(InvokeMemberBinderbinder,object[]args,outobjectresult){inti=(int)args[0];intj=(int)args[1];target.Swap(refi,refj);参数[0]=我;args[1]=j;结果=空;返回真;}}classTarget{publicvoidSwap(refinti,refintj){inttmp=i;我=j;j=tmp;7月15日更新:Microsoft声称将在下一版本的.NET中解决此问题http://connect.microsoft.com/VisualStudio/feedback/details/543101/net-4-0s-dynamicobject-doesn-t-set-REFoutarguments2012年9月8日更新:使用.NET4.0和4.5对VS.NET2012进行测试,确认:已修复。这看起来可能是一个错误-可能在DynamicObject中。如果像这样向Proxy添加Wrap方法:publicvoidWrap(refintx,refinty){target.Swap(refx,refy);那么即使它仍然被动态调用(即Main的代码保持不变)代码也可以工作......所以至少一般的“动态对象如何工作”层支持按引用传递。我怀疑如果这确实是DLR中的错??误,修复.NET4可能为时已晚-但无论如何都值得向Connect报告,以便它可以在服务包中修复。或者,如果它是有意的限制/限制,它应该在MSDN中有明确的记录(据我所知,目前还没有)。这不是错误。如此处所述,DynamicObject不支持TryInvokeMember中的ref和out参数。传递给此方法的所有内容都被视为“值”。很快,TryInvokeMember方法将忽略这些关键字,这就是您的方法不起作用的原因。如果您遵循JonSkeet的建议并在继承自DynamicObject的类中创建自己的Wrap方法,情况会略有不同。工作流程如下:当有对DynamicObject的方法调用时,C#运行时绑定程序首先在类本身中查找该方法。如果可以找到,则调用此方法。此时,关于“ref”和“out”参数的信息仍然被保留。如果找不到这样的方法,它会调用TryInvokeMember方法并简单地抛出有关“ref”和“out”关键字的信息,并开始将每个关系视为“按值”。请记住,DynamicObject必须支持与其他语言的互操作性,这些语言可能不具备C#的所有功能。没错,现在文档中没有关于“ref”和“out”的信息。我将在下一次文档更新中添加它。总而言之,DynamicObject不支持按引用传递,因此您不想直接这样做。以上就是C#学习教程的全部内容:C#4.0'dynamic'不设置ref/out参数。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
