6

DLR の LINQ 式では、次の違いは何ですか:

Expression.Convert(SomeVariableExpression, typeof(T));

この:

Expression.Unbox(SomeVariableExpression, typeof(T));

これに関するドキュメントは少し大ざっぱなようです。

さらに、この C# コードに相当するものは次のどれですか。

(ClassA)InstanceOfClassB

ClassB には、ClassA にキャストするための暗黙的または明示的な演算子がありますか?

4

4 に答える 4

4

Unboxで重要なことは、ボックス化された値のアドレスを提供することです。これにより、ボックス化されていない値に対してメソッドを呼び出すことができます。そのメソッドが値型を変更する場合、新しいコピーではなく、ボックス化されたバージョンを変更します。Convertを実行しただけの場合は、実際にはボックス化された値型のコピーを作成し、そのメソッドを呼び出すと、元の値ではなくコピーが変更されます。

于 2009-06-09T20:16:47.233 に答える
3

主な違いはEpression.Unbox、ヒープからの値型の明示的なボックス化解除にのみ必要であるということです。 Expression.Convertユーザー定義の変換 (暗黙的または明示的) にフックするために使用するメソッドです。

参照Expression.Convert:

expression.Type または type が、暗黙的または明示的な変換演算子を定義するユーザー定義型である場合、MethodInfoその演算子を表す が実装メソッドです。

また:

expression.Type または type が参照型であり、expression.Type から型への明示的なボックス化、ボックス化解除、または参照変換が存在する場合、実装メソッドは null です。

于 2009-06-09T17:36:08.953 に答える
2

一般に、ボクシングは値の型を取り、それをオブジェクトにラップします。箱から出すと逆になります。これは、ボクシングがレジスタまたはスタックの値を取得してヒープに置き、その値へのポインターを返すと考えることができます。ボックス化解除は、ヒープ上のオブジェクトを取得し、レジスタまたはスタック フレームに配置します。基礎となるデータ型は同じままです。

Convert は、あるデータ型を別のデータ型に変更します。

于 2009-06-09T17:42:15.433 に答える