私は、次の質問に対する答えを見つけることができません。IS演算子のアンボックスの値の型はありますか?
object o = 10; // Box
int i = (int)o; // Unbox
それは明らかだが、次は
bool isInt = o is int; // Is the unbox here or not?
私は、次の質問に対する答えを見つけることができません。IS演算子のアンボックスの値の型はありますか?
object o = 10; // Box
int i = (int)o; // Unbox
それは明らかだが、次は
bool isInt = o is int; // Is the unbox here or not?
いいえ、それはアンボクシングではありません明確ではありません - それだけのタイプかどうかをチェックしています正しい。実際にオブジェクトが関与していることを忘れないでください。その型のチェックは、値がボックス化された値の型の値であるかどうかにかかわらず、基本的に同じ操作です。 (継承は考慮されないため、値の型や密封された型にはいくつかの最適化が可能ですが、基本的にオブジェクトヘッダーの "型"部分をチェックしています)。
コンパイルするかどうかを確認する方法コードとは、IL使っILASMを見て:
// object o = 10
IL_0000: ldc.i4.s 10
IL_0002: box [mscorlib]System.Int32
IL_0007: stloc.0
// int i = (int) o;
IL_0008: ldloc.0
IL_0009: unbox.any [mscorlib]System.Int32
IL_000e: stloc.1
// bool isInt = o is int
IL_000f: ldloc.0
IL_0010: isinst [mscorlib]System.Int32
は、だから、
isinst
使用しています - 何のアンボクシングは必要ありません。
論理的にアンボックスする必要はないだけでなく、論理的にはできません。
アンボックスは、アンボックスにしようとしているタイプの値が実際にオブジェクトに含まれているかどうかによって、成功または失敗することがあります。
したがって、アンボックスでは、オブジェクトがその特定の種類であるかどうかのチェックが必要です。
アンボクシング必要なタイプをテストする場合はアンボクシングは種類のテストを必要とするため、我々は...
は、そのためのタイプをテストすることは、第1箱なし必要とすることはできませんでしょうまでそのため、その後、我々はVHS版することはできませんアンボックス。
C#7以降、is
キーワードは、型パターンとしてのパターンマッチングで新しい使用例を得ました。この場合、アンボクシングは、例えば発生した:
object o = 10;
if (o is int i) {
// i is the unboxed value.
}
は明らかに、これは、あなたが実際に値を代入しているパターンとしてis
を使用した場合、元のポストの値は純粋にテストされている場合、異なる場合です。したがって、この場合にはunboxする必要があります。
明らかに - 元のメッセージについては何も変更されていません。o is int
ケース - 古い回答ごとにアンボックスは発生しません。 is
というキーワードが新しい役割を果たしました。
CLRはアンボックスしないでタイプをチェックできますか? –
@ViacheslavSmityukh:はい。実際にオブジェクトが関与していることを忘れないでください。その型のチェックは、値がボックス化された値の型の値であるかどうかにかかわらず、基本的に同じ操作です。 –
@JonSkeetあなたは答えにそのコメントを編集できますか?私は説明していると思います。 – Servy