Nullable 型
C# で null 許容型が導入されています。
これは .net fx への Nullable
というわけで書いてみました。
typedef NullableintNA; void check( intNA% nuin ) { if ( nuin.HasValue ) { Console::WriteLine(L"値は {0} です。", nuin); } else { Console::WriteLine(L"値は未定義値です。"); } if ( nuin.Equals(nullptr) ) { Console::WriteLine(L"値は未定義値と Equals です。"); } } int main(array ^ args) { intNA nuint; Console::WriteLine("Test 1: 未定義値"); check(nuint); Console::WriteLine("Test 2: int 値 5 代入"); nuint = 5; check(nuint); Console::WriteLine("Test 3: int 値 0 代入"); nuint = 0; check(nuint); Console::WriteLine("Test 4: nullptr 代入"); nuint = nullptr; // コンパイル・エラー check(nuint); }
これを実行すると、
Test 1: 未定義値 値は未定義です。 値は未定義です。 Test 2: int 値 5 代入 現在の値は 5 です。 Test 3: int 値 0 代入 現在の値は 0 です。
0 と nullptr がちゃんと区別されて扱われています。
ただ気になったのが Test 4 です。
これをコンパイルすると、
エラー 1 error C2440: '=' : 'nullptr' から 'intNA' に変換できません。
というエラーが出力されます。
まぁ、一度定義された値を未定義値に戻すことはできない、ということなのだと思いますが、C# だと初期値設定時に nuint = null; という代入文が許可されているので気になりますね。
C# で同等文をチェックすると、再度の未定義値への変更が許されていますね。
つまり、C++/CLI の nullptr と C# の null 値は同等でないということか。どうすれば、未定義値に戻せるか、もう少し調べてみることにします。