C# 将参数传递给需要“引用”的方法;参考系统数组“;
我使用的是第三方图书馆。其中一个方法需要通过ref传递一个数组,该数组将填充一些信息。以下是该方法的定义:C# 将参数传递给需要“引用”的方法;参考系统数组“;,c#,arrays,methods,C#,Arrays,Methods,我使用的是第三方图书馆。其中一个方法需要通过ref传递一个数组,该数组将填充一些信息。以下是该方法的定义: int GetPositionList(ref Array arrayPos) 如何构造arrayPos以使此方法有效?在库中不太完整的文档中,它定义了如下方法: long GetPositionList(structSTIPosUpdate() arrayPos) 我已经试过了,但我当然会出错: System.Array position_list = new System.Arra
int GetPositionList(ref Array arrayPos)
如何构造arrayPos以使此方法有效?在库中不太完整的文档中,它定义了如下方法:
long GetPositionList(structSTIPosUpdate() arrayPos)
我已经试过了,但我当然会出错:
System.Array position_list = new System.Array();
sti_position.GetPositionList(ref position_list);
有什么想法吗?这可能会帮助您:
…虽然我不明白为什么一个对象需要有“ref”关键字。对象是通过引用传递的,因此无论如何这都应该可以工作,而不需要使用ref关键字。对于像int[]
或string
这样的数组,我理解这一点…这可能会帮助您:
…虽然我不明白为什么一个对象需要有“ref”关键字。对象是通过引用传递的,因此无论如何这都应该可以工作,而不需要使用ref关键字。对于像int[]
或string
这样的数组,我理解…您可以使用它
Array position_list = new int[]{1, 3, 5, 5,6};
sti_position.GetPositionList(ref position_list);
这项工作:
Array position_list = new int[]{1, 3, 5, 5,6};
sti_position.GetPositionList(ref position_list);
要创建
数组的实例
,可以使用CreateInstance
方法:
Array a = Array.CreateInstance(typeof(Int32), 10);
GetPositionList(ref a);
数组的类型、维度和大小是库作者应该记录的内容。GetPositionList
的设计可能很糟糕,只需为您创建一个新的数组
,这意味着库作者应该使用out
而不是ref
。在这种情况下,您可以使用null
数组:
Array a = null;
GetPositionList(ref a);
要创建
数组的实例
,可以使用CreateInstance
方法:
Array a = Array.CreateInstance(typeof(Int32), 10);
GetPositionList(ref a);
数组的类型、维度和大小是库作者应该记录的内容。GetPositionList
的设计可能很糟糕,只需为您创建一个新的数组
,这意味着库作者应该使用out
而不是ref
。在这种情况下,您可以使用null
数组:
Array a = null;
GetPositionList(ref a);
这是Sterling Trader Pro ActiveX API,对吗?您是否使用
tlbimp.exe
创建了互操作dll?GetPositionList
API需要一个数组,该数组将保存structSTIPositionUpdate
类型的结构。如果被调用方初始化传入的数据,通常使用out
修饰符,如果要初始化数据,则使用ref
。根据API的含义,修饰符应为out
,以便:
structSTIPositionUpdate [] entries = new structSTIPositionUpdate[0]; // or null
num_entries_returned = GetPositionList(ref entries);
或者,尝试创建一个包含这些结构的数组,该数组的大小足以容纳预期数量的条目,然后将其传递给函数:
structSTIPositionUpdate [] entries = new structSTIPositionUpdate[100]; // say
num_entries_returned = GetPositionList(entries);
更新:如果您与System.Array的类型不匹配,请重试
System.Array entries = Array.CreateInstance(typeOf(structSTIPositionUpdate), N);
其中N是数组中的元素数。这是Sterling Trader Pro ActiveX API,对吗?您是否使用tlbimp.exe
创建了互操作dll?GetPositionList
API需要一个数组,该数组将保存structSTIPositionUpdate
类型的结构。如果被调用方初始化传入的数据,通常使用out
修饰符,如果要初始化数据,则使用ref
。根据API的含义,修饰符应为out
,以便:
structSTIPositionUpdate [] entries = new structSTIPositionUpdate[0]; // or null
num_entries_returned = GetPositionList(ref entries);
或者,尝试创建一个包含这些结构的数组,该数组的大小足以容纳预期数量的条目,然后将其传递给函数:
structSTIPositionUpdate [] entries = new structSTIPositionUpdate[100]; // say
num_entries_returned = GetPositionList(entries);
更新:如果您与System.Array的类型不匹配,请重试
System.Array entries = Array.CreateInstance(typeOf(structSTIPositionUpdate), N);
其中N是数组中的元素数。我也使用Sterling Trader API。我使用以下代码:
private structSTIPositionUpdate[] PositionList {
get {
Array arrayPos = null;
_position.GetPositionList(ref arrayPos);
return (structSTIPositionUpdate[]) arrayPos;
}
}
我还使用了Sterling Trader API。我使用以下代码:
private structSTIPositionUpdate[] PositionList {
get {
Array arrayPos = null;
_position.GetPositionList(ref arrayPos);
return (structSTIPositionUpdate[]) arrayPos;
}
}
因为它不仅会填充数组,还会创建一个新数组,并用对新数组的引用替换调用方的引用。如果没有ref或out关键字,这是不可能的,它允许您将引用传递给引用本身(通常您传递引用的副本)。因为它不仅填充数组,还将创建一个新的数组,并用对新数组的引用替换调用方的引用。如果没有ref或out关键字,这是不可能的,它允许您将引用传递到引用本身(通常您传递引用的副本)。@Vinay-是的,这是Sterling API。当我尝试执行您描述的操作时,我了解到了这一点:“SterlingLib.ISTIPosition.GetPositionList(ref-System.Array)”的最佳重载方法匹配有一些无效参数,参数“1”:无法从“ref-SterlingLib.structSTIPositionUpdate[]”转换为“ref-System.Array”,您接受了这个答案创建实例对您有效吗?不幸的是,我也在用英镑工作,想在订单上交换一些钞票entry@Vinay-是的,这是Sterling API。当我尝试执行您描述的操作时,我了解到了这一点:“SterlingLib.ISTIPosition.GetPositionList(ref-System.Array)”的最佳重载方法匹配有一些无效参数,参数“1”:无法从“ref-SterlingLib.structSTIPositionUpdate[]”转换为“ref-System.Array”,您接受了这个答案创建实例对您有效吗?不幸的是,我也在用英镑工作,想在订单录入时交换一些票据