アップキャストまたはダウンキャストを行うとき、舞台裏で実際に何が起こりますか?私は次のように何かをするときの考えを持っていました:
string myString = "abc";
object myObject = myString;
string myStringBack = (string)myObject;
最後の行のキャストは、目的がコンパイラーに安全であることを伝えるためだけのものであり、何も悪いことはしていません。そのため、実際にはキャストコードはコード自体に埋め込まれないという考えがありました。私は間違っていたようです:
.maxstack 1
.locals init (
[0] string myString,
[1] object myObject,
[2] string myStringBack)
L_0000: nop
L_0001: ldstr "abc"
L_0006: stloc.0
L_0007: ldloc.0
L_0008: stloc.1
L_0009: ldloc.1
L_000a: castclass string
L_000f: stloc.2
L_0010: ret
なぜCLRは次のようなものが必要なのcastclass string
ですか?
ダウンキャストには2つの可能な実装があります。
- が必要です
castclass something
。を実行するコード行に到達するとcastclass
、CLRはキャストを作成しようとします。しかし、キャストクラスの文字列行を省略してコードを実行しようとするとどうなるでしょうか。 - は必要ありません
castclass
。すべての参照型は同様の内部構造を持っているため、Formインスタンスで文字列を使用しようとすると、誤った使用法の例外がスローされます(Formが文字列またはそのサブタイプではないことを検出するため)。
また、一言で言えば、C#4.0の次の統計は正しいですか?
Upcasting and downcasting between compatible reference types performs reference
conversions: a new reference is created that points to the same object.
それは本当に新しい参照を作成しますか?同じ参照であり、異なるタイプの変数にのみ格納されると思いました。
ありがとう