C# 将参数传递给需要“引用”的方法;参考系统数组“;

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

我使用的是第三方图书馆。其中一个方法需要通过ref传递一个数组,该数组将填充一些信息。以下是该方法的定义:

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”,您接受了这个答案创建实例对您有效吗?不幸的是,我也在用英镑工作,想在订单录入时交换一些票据