我刚刚在C#中工作时遇到此错误消息
属性或索引器不能作为out或ref参数传递
我知道造成这种情况的原因并快速解决了创建正确类型的局部变量的问题,使用它作为out/ ref参数调用函数,然后将其分配回属性:
RefFn(ref obj.prop);
Run Code Online (Sandbox Code Playgroud)
变成
{
var t = obj.prop;
RefFn(ref t);
obj.prop = t;
}
Run Code Online (Sandbox Code Playgroud)
显然,如果属性不支持在当前上下文中获取和设置,则会失败.
为什么C#不能为我这样做?
我能想到这可能导致问题的唯一情况是:
对于线程转换影响写入发生时(在函数调用之后与函数调用之间),但我宁愿怀疑任何依赖的代码在它中断时会得到很少的同情.
对于例外,关注的是; 如果函数分配给几个ref参数之一而不是抛出会发生什么?任何一个简单的解决方案都会导致所有参数都被分配给某些参数,而某些参数不应该分配给某些参数.我再次认为这不会支持使用该语言.
注意:我理解为什么会生成此错误消息的机制.我正在寻找的是为什么C#不会自动实现简单的解决方法.
我试图了解如何使用参考参数.我的文本中有几个例子,但是它们太复杂了我无法理解为什么以及如何使用它们.
你想如何以及为什么要使用参考?如果您没有将参数作为参考,而是将其&关闭,会发生什么?
例如,这些功能之间的区别是什么:
int doSomething(int& a, int& b);
int doSomething(int a, int b);
Run Code Online (Sandbox Code Playgroud)
我知道引用变量用于更改形式 - >引用,然后允许参数的双向交换.然而,这是我的知识范围,更具体的例子会有很大帮助.
一个很长的标题,但我希望它具体.标题确实是个问题.即使InvokeMember正在调用的方法有一个out参数并且正在为该参数赋值,我也无法获取该值.这是我最初使用的代码:
string parameter = "";
int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, new object[] { parameter }));
Run Code Online (Sandbox Code Playgroud)
我改变了这个,现在它按预期工作但我不知道为什么:
object[] args = new object[1]; //necessary to retrieve ref/out parameter
int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, args));
Run Code Online (Sandbox Code Playgroud)