- 101 名前:デフォルトの名無しさん mailto:sage [2012/09/10(月) 17:34:17.61 ]
- Interface の明示的実装と Generic について質問です。
Interface を返すメソッドを明示的実装によって その Interface を実装する構造体を返すように定義したとします。 Interface の型にボクシングされないようにその機能を使いたいのですが、 以下の認識で合っていますか ? List<T>.Enumerator が構造体なので、 Run(Enumerable.Range(0, 10).ToList(), action) というようにそれぞれ実行したとします。 action 内ではボクシングは無いものとします。 // 1. ボクシングされない例 void Run<T>(List<T> list, Action<T> action) { foreach (var i in list) action(i); } // 2. ボクシングされる例 void Run<T>(IEnumerable<T> list, Action<T> action) { foreach (var i in list) action(i); } // 3. ボクシングされる例 ? void Run<TList, TItem>(TList list, Action<TItem> action) where TList : IEnumerable<TItem> { foreach (var i in list) action(i); } 最後の Run は List<T> が構造体ではないため Generic が特殊化されず、 IEnumerator<TItem> にボクシングされてしまうと考えました。 List<T> を構造体でラップしたような型を引数にした場合は特殊化され、ボクシングの起きないコートになるのでしょうか ?
|

|