4

コードベースでエラーをスローする関数に遭遇しました:

public static T InternalData<T>()
{
    return (T)"100";
}

明らかに、コードを単純化し、「100」をリテラル文字列値として追加しました。T は型intです。

それはスローします:

System.InvalidCastException: 指定されたキャストは無効です。

文字列を暗黙的に C# に変換することはできないようですがint、ジェネリック型の変換を処理できるようにこのコードを修正するにはどうすればよいですか?

実際のコードは次のようになります。

public static T InternalData<T>()
{
    return (T) something (not sure of type or data);
}
4

4 に答える 4

11

試す:

public static T InternalData<T>(object data)
{
     return (T) Convert.ChangeType(data, typeof(T));
}

これは、インターフェイスを実装する型IConvertible( whichInt32およびdos ) に対してString機能します。

于 2012-09-05T12:51:45.933 に答える
7

1つの可能性は、使用することです

return (T)Convert.ChangeType(yourValue, typeof(T));

yourValueを実装する型のインスタンスでない場合、これは例外をスローすることに注意してくださいIConvertible。また、「100」の代わりに「abc」がある場合など、値自体を変換できない場合にも例外がスローされます。

于 2012-09-05T12:52:17.473 に答える
4

を使用しConvert.ChangeTypeます。

public static T InternalData<T>()
{
    return (T)Convert.ChangeType("100", typeof (T));
}

値を変換できない場合でもエラーがスローされますが、直接キャストは試行されません。文字列をintに変換できます。

于 2012-09-05T12:52:50.083 に答える
1

キャストと変換を混同しないでください。式の真の型がコンパイラに認識されていない場合 (たとえば、式が として型付けされていてobject、その固有の型がわかっている場合)、C# コンパイラに次のように伝えることができintますint。 .

 (int)expression

intあなたの場合、式は にキャストできない文字列式ですintintただし、文字列が有効な整数を表している場合は、文字列を に変換できます。さらに、変換の結果の型は汎用であるため不明です。(T)Convert.ChangeType(...)他の人がすでに提案したように使用してください。

于 2012-09-05T13:02:52.147 に答える