3

私は簡単な方法を持っています:

public static T GetValue<T>(SqlDataReader reader, int columnIndex, T defaultValue = default(T))
{
    return reader.IsDBNull(columnIndex) ? defaultValue : (T)reader[columnIndex];
}       

そしてそれの使用法:

string s = SqlUtils.GetValue<string>(reader, nameOrd);

<string>返されるパラメーターの型が文字列であることが使用法から明らかな場合、なぜ指定する必要があるのでしょうか? しかし、そうしないとコンパイラが文句を言うので、どうやら私はそうしなければなりませんThe type arguments cannot be inferred from the usage...。私のロジックはどこで失敗しますか?

4

1 に答える 1

9

私のロジックはどこで失敗しますか?

どこにもない。仕様 ( ) によると25.6.4 Inference of Type Arguments、コンパイラは戻り値ではなく引数のみを使用してジェネリック型推論を行います (メソッド呼び出しでデフォルト値パラメーターを省略したため、この規則に違反していることを思い出してください)。したがって、C# を使用する場合、仕様では、ジェネリック型の推論は戻り値の型のみでは不可能であることが示されています。または、これを可能にする他のCLS言語を使用してください。C# にはありません。

于 2012-07-16T22:03:02.167 に答える