0

私のプロジェクトにはドロップダウンリストがあり、このコードはリストの値を提供します

CrawlIntervalList = new SelectList(new[] {1,2,3,4,5,6,7,8,9,10}, 2);

のデフォルト値を設定しようとしています2。これがデフォルト値だと思うのは正しいです^、そうでない場合は機能していないようです、そうでない場合、この値はどういう意味ですか?

4

1 に答える 1

2

ここでの問題は、SelectListジェネリックではないためobject、アイテムタイプとして使用することです。intを期待するメソッドにを渡すとobject、それintは自動的にボックス化されます。そのボクシング操作は、その値をint新しいものにラップobjectし、ヒープに配置します。intこのボクシング操作は、型の変数に値型(など)を割り当てるたびにobject、または。を期待するメソッドに値型を渡そうとした場合に再び発生しますint

2番目のパラメーターはデフォルト値のようですが、2渡したものはボックス化されており、の新しいインスタンスが作成されますobject。同時に、配列内の数値もボックス化されています(、でもIEnumerable機能しobjectます)。ただし、これら2つのボクシング操作は別々に発生し2、配列内と22番目のパラメーターとして渡したものobjectは、ヒープ上の異なる場所で異なるsになります。したがって、は、これら2つのが同じオブジェクトを参照することを意図していることSelectListを知る方法がありません。2

解決策は、このボクシング操作を1回だけ実行することです。

これを回避するには、デフォルトの要素を手動で選択するか、:を使用しますobject[]

object[] values = new object[] {1,2,3,4,5,6,7,8,9,10};
CrawlIntervalList = new SelectList(values, values[1]);

それではなく、を作成することにより、そのobject[]中のすべての整数がボックス化されobject、参照が作成されます。2番目のパラメーターとして渡すことによりvalues[1]、正しい参照がコンストラクターに渡されることを確認します。

ボクシングの詳細については、こちらをご覧ください:http:
//msdn.microsoft.com/en-us/library/yz2be5wk.aspx

于 2013-02-28T11:04:55.733 に答える