3

VB.NET で構造体を null 許容型にすると、構造体のメンバーが表示されないのはなぜですか?

例:

Public Structure myNullable  
    Dim myNullVar As Integer  
End Structure

Sub Main()  
    Dim myInstance As myNullable 'This works.  
    Dim myNullableInstance? As myNullable 'This works.   
    myInstance.myNullVar = 1  'This works.     
    myNullableInstance.myNullVar = 1   'This doesn't work.  
End Sub
4

5 に答える 5

3

他の人が言ったように、Valueプロパティを使用して値を取得する必要があります。ただし、System.Nullable<T>不変です -Valueプロパティは読み取り専用です。値のコピーが返されるため、フィールドを変更できたとしても、希望どおりにはなりません。

これは実際には良いことです。値の型は不変でなければなりません。可変構造体は恐ろしいものNullable<T>です。型の使用が困難になるという事実が原因で、不変性の道をたどってしまうのであれば、それは素晴らしいことです。

フィールドを読み取り専用にし、コンストラクターを追加して値を渡すことができるようにします。次に、null 許容値を変更しようとする代わりに、まったく新しい値を変数に割り当てます。

于 2009-08-11T16:06:20.623 に答える
0

これが機能しないことは理にかなっています。

myNullableInstance.Value.myNullVar = 1

基本的に、Value プロパティによって返された構造体のコピーに割り当てます。

通常、構造はベスト プラクティスとして不変になるように作られているため、これは実際には問題ではありません。いくつかの割り当てを行ったり来たりしてこれを回避できますが、他の人が投稿したように、代わりにクラスを使用することを再検討する必要があります。そうすれば、null 参照だけを使用できるため、Nullable も必要ありません。

于 2009-08-11T16:16:16.517 に答える
0

構造体は、プロパティNullable<T>を介して基になる値を公開するためです。Valueしたがって、次のものが必要です。

myNullableInstance.Value.myNullVar = 1
于 2009-08-11T15:44:51.680 に答える
0

Nullable 構造体は苦痛であり、Microsoft が物事をそれほど難しくしなければならない正当な理由はありません。この方法は、言語ユーザーではなくコンパイラ作成者にとって簡単にするために行われました。

実際、参照型と値型の動作を異なるものにする必要がある正当な理由はありません。Microsoft は論理ポインター (アドレス) を隠そうとしていますが、物事がより困難になるため、うまく機能しません。言語に課せられるすべてのルールと制限は、物事をより困難にし、非効率性、実行時エラー、およびより高い開発コストをもたらします。

論理型付きポインターに戻せば、私たち全員がより良くなるでしょう。そうすれば、不変のような派手な言葉は​​必要ありません。(不変とは不変を意味します!)

私の提案は、Nullable 構造を捨てて、常に nullable なクラスにすることです。

于 2013-04-30T18:20:30.647 に答える