Nullable 型

 C# で null 許容型が導入されています。
 これは .net fx への Nullable 型の導入です。つまり、C++/CLI でも使えるはずです。(ぉ

 というわけで書いてみました。

typedef Nullable intNA;

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 値は同等でないということか。どうすれば、未定義値に戻せるか、もう少し調べてみることにします。