0

おそらく、ボックス化とボックス化解除で混乱している可能性があります。

MSDN の次のステートメントを検討してください。

「ボックス化解除は、型オブジェクトから値型へ、またはインターフェイス型からインターフェイスを実装する値型への明示的な変換です。」

したがって、これは、ボックス化解除が値型パラメーターにのみ適用できることを意味します。

これでOKです。

var concernedInteger = (int)myObject; //unboxing is ok.

クラスは参照型であるため、これは機能しません (ボックス化解除は値型にのみ適用されるため)

var concernedClassObject = (TestClass)testClassObject // unboxing is still ok.

ReSharper にエラーは表示されません。

それで、私の質問は、「MSDNが値型のみをボックス化解除できると言っているときに、参照型変数をボックス化解除するにはどうすればよいですか」です。

4

2 に答える 2

8

これは開封ではありません。ですtype casting

ボックス化解除とは、値を参照から値の型に引き出すことです (キャストが成功すると仮定します)。そのように参照型を移動しているとき..それは単なる通常の型キャストです。

とにかく、ボクシングとアンボクシングはどちらのタイプでもありtype castingます。それらに特別な名前 (boxing および unboxing) が付けられている理由は、いくつかのルックアップ テーブルが変更されるだけでなく、管理された環境でさらに多くのことが行われるためです。これが、値型のボックス化とボックス化解除という用語に分けられている理由です..しかし、参照型になると..それは単なる型キャストです.

于 2013-09-03T06:21:13.677 に答える
2

ここで行っていることはTypeCasting、ボクシング/アンボクシングではありません。ただし、ボックス化解除と明示的な参照変換の両方に同じキャスト構文が使用されます

ボクシングとアンボクシング:

Boxing値型を参照型、基本的にオブジェクトとunboxingの間でキャストするときに機能します

簡単なboxingunboxingは次のようになります

             int i=1;
             object o=i; /// This is boxing
             int j = (int)o; /// This is unboxing

型キャスト:

型キャストは変換を引き起こします。型キャストは、式を特定の型に明示的に変換します。

(type) expression

expression型のオブジェクトに変換しますtype。例を考えてみましょう

 long _longval = 1;
 int i = (int)_longval

明示的なキャストは、実際にはコンパイラーに、情報の損失の可能性について知っているが、それでもキャストを実行する必要があることを伝えます。これは組み込みの数値型では問題ありませんが、参照型ではまったく互換性がない場合があります。たとえば

  string _mystring="abc";
  int i=(int)_mystring;

このようなキャスト式は正常にコンパイルされますが、実行時に失敗し、InvalidCastException エラーが発生します。

キーワードとして使用:

  MyClass _MyObject = (MyClass ) obj;
  MyClass MyObject = obj as MyClass ;

コードの最初の行でキャストが失敗すると、例外がスローされますが、2 行目ではnull値のみが取得されます。

于 2013-09-03T06:30:18.550 に答える