如何在C CLI中从数组<unsigned short =“”>复制到unsigned short []?</unsigned>

时间:2013-11-11 21:56:32

标签: c# c++ c arrays

我正在为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”类型的实体。这个的正确语法是什么?

3 个答案:

答案 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];

这只影响属性 - 看起来返回托管数组的函数在索引编制索引时按预期工作。