2011-03-05 14 views
3

これは基本的な質問かもしれませんが、ジェネリック型をジェネリックメソッドに値型のリストを渡すときに元の型にキャストできません。ジェネリック型を値型にキャストできないのはなぜですか?

IList<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 }; 
Inverse<int>(list); 

    public void Inverse<T>(IList<T> list) 
     { 
      for (i = 0; i <= list.Count/2; i++) 
      { 
       int a = list[i] as Int16; //=> does not work 
       int b = (int)list[i]; //=> does not work either 

      } 
     } 

答えて

6

IListの型が「int」であると仮定しているので、一般的なメソッドのポイントを完全に見逃してしまいました。あなたがやった場合

T a = (T)list[i]

は、それが働くだろう。

2

まあ、Tに制約がないので、2番目のエラーは、最初のエラーのよう

Inverse<Person>(new List<Person>()); 

のようなものを防ぐためである、Tはノーを持っているので、asのみ再び参照型のために働き、コンパイラは何も推論できません。

0

Int16(short)は値の型ですが、オブジェクト参照をキャストしようとしているため、Int16として使用することはできません。しかし、あなたの設計もジェネリックのポイントを逃しています。あなたは整数を期待していますが、一般的な方法を使用しているので、Tは本当に何かになる可能性があります。

1

あなたは間違っています。 Inverseはint型だけでなく、あらゆる型のTを受け入れます。コンパイラは、それはそれでコンパイラエラーがスローされますので、&でどのような種類を知っていないためであるT

1
int b = Convert.ToInt32(list[i]); 

代わりの

int b = (int)list[i]; 

とint型の発生を置き換えます。私はそれが型推論でC#4で動作するかどうかはわかりません。

EDIT:http://msdn.microsoft.com/en-us/library/cscsdfbt.aspx

:オペレータは 互換 参照タイプ

基準との間の変換の 特定のタイプを実行するために使用されるため

as文はあなたの例では動作しないことができ

+0

私は変換を勧めません。この場合、オブジェクトのToStringを呼び出して解析します。そして、あなたは帽子Tが隠れることは知りません。 – Euphoric

関連する問題