我正在为C API开发C ++ CLI包装器。 C API的结构包含四个无符号短路的数组和四个整数的数组。所以我为调用包装函数时使用的C#代码创建了一个类似的类。
// C Structure
typedef struct c_Struct_
{
unsigned short uShorts[4];
int ints[4];
} c_Struct;
// C++ CLI Class
public ref class CliClass
{
public:
property array<unsigned short>^ UnsignedShorts
{
array<unsigned short>^ get()
{
return _unsignedShorts;
}
}
property array<int>^ Ints
{
array<int>^ get()
{
return _ints;
}
}
CliClass(array<unsigned short>^ us, array<int> i)
{
_unsignedShorts = us;
_ints = i;
}
private:
array<unsigned short>^ _unsignedShorts;
array<int>^ _ints;
}
现在我们来回答我的问题。我已经在CLI类中添加了一个内部方法来创建一个struct:
internal:
c_Struct ToStruct()
{
c_Struct results;
results.uShorts[0] = UnsignedShorts[0];
results.uShorts[1] = UnsignedShorts[1];
results.uShorts[2] = UnsignedShorts[2];
results.uShorts[3] = UnsignedShorts[3];
results.ints[0] = Ints[0];
results.ints[1] = Ints[1];
results.ints[2] = Ints[2];
results.ints[3] = Ints[3];
return results;
}
但是我收到错误: IntelliSense:对于每个分配,无法将类型为“System :: Object ^”的值分配给“unsigned short”类型的实体。这个的正确语法是什么?
答案 0 :(得分:1)
首先取消装箱参考类型,试试这个:
results.uShorts[0] = (unsigned short)UnsignedShorts[0];
答案 1 :(得分:1)
代码是正确的,你会发现你的程序编译得很好。没有任何东西被装箱。这是IntelliSense解析器中的错误。一个相当奇怪的,很难想象它是如何摸索这一点。并非完全不常见,解析器是由另一家公司制作的。 Edison Design Group,因编写能够正确实现C ++ 03标准的唯一编译器而闻名。 C ++ / CLI让他们心痛。
两个基本的解决方法,您可以使用字段而不是属性:
c_Struct ToStruct() {
c_Struct results;
results.uShorts[0] = _unsignedShorts[0];
// etc...
}
但这并不能解决您使用该类的代码所遇到的问题。您可以改为编制索引属性:
property unsigned short UnsignedShorts[int]
{
unsigned short get(int index) {
return _unsignedShorts[index];
}
}
// Same for the Ints property.
答案 2 :(得分:1)
另一种解决方法是首先分配一个临时局部变量。
array<int> ^temp = ArrayOfIntsProperty;
int j = temp[0];
这只影响属性 - 看起来返回托管数组的函数在索引编制索引时按预期工作。