配列は見かけによらない

C++/CLIに限らず他の言語にも存在する現象だと思いますが
馬鹿な自分はこれで随分時間とられたんですよ!どうせ自分が悪いんだよ!あー眠みぃ

#include <stdio.h>

typedef struct {
  int Wait;
} ValueStruct;

int _tmain(int argc, _TCHAR* argv[]) {
  ValueStruct valueStructs[16];
  ValueStruct valueStruct;
  
  valueStructs[0].Wait = 353;
  printf("valueStructs[0] = %d\n", valueStructs[0].Wait);
  getchar();
  
  return 0;
}

実行結果はどうなると思いますか?
これは普通に

> valueStructs[0] = 353

となります。


では、こちらはどうなると思いますか?

#include "stdafx.h"

using namespace System;
using namespace System::Collections::Generic;

value class ValueStruct {
public :
  property int Wait;
};

ref class RefClass {
public :
  property int Wait;
};

int main(array<System::String ^> ^args) {
  List<ValueStruct>^ valueStructs = gcnew List<ValueStruct>();
  List<RefClass^>^ refClasses = gcnew List<RefClass^>();
  
  ValueStruct valueStruct;
  RefClass^ refClass = gcnew RefClass();
  
  valueStructs->Add(valueStruct);
  refClasses->Add(refClass);
  
  valueStructs[0].Wait = 353;
  refClasses[0]->Wait = 353;
  
  Console::WriteLine("valueStructs[0].Wait = " + valueStructs[0].Wait);
  Console::WriteLine("refClasses[0]->Wait = " + refClasses[0]->Wait);
  Console::ReadLine();
  
  return 0;
}

結果は

> valueStructs[0].Wait = 0
> refClasses[0]->Wait = 353

valueStructs[0].Wait = 0 ですよ。これでもうまったく…
早々にネタバレしますと、"valueStructs[0]"って書いたときに返ってくるのは配列の先頭のオブジェクトのコピーなワケですね。valueStructsは配列ではなくListクラスのインスタンスなのです。
そりゃコピーのWaitに値を代入しても意味ないって。


まー、そういうことです。万一知らなかった人がここ読んでたら覚えておいてください。