13

同様の構造を書くことは可能ですか?
どういうわけか、型 T の引数のデフォルト値を設定したい.

    private T GetNumericVal<T>(string sColName, T defVal = 0)
    {
        string sVal = GetStrVal(sColName);
        T nRes;
        if (!T.TryParse(sVal, out nRes))
            return defVal;

        return nRes;
    }

さらに、次のリンクを見つけました: Generic type conversion FROM string
私が思うに、このコードは機能するはずです

private T GetNumericVal<T>(string sColName, T defVal = default(T)) where T : IConvertible
{
    string sVal = GetStrVal(sColName);
    try
    {
        return (T)Convert.ChangeType(sVal, typeof(T));
    }
    catch (FormatException)
    {
        return defVal;
    }            
}
4

3 に答える 3

18

私はこれを試していませんが、に変更T defVal = 0しますT defVal = default(T)

于 2012-03-27T13:28:26.700 に答える
5

T にパラメーターなしのコンストラクターがあることがわかっている場合は、 new T() を次のように使用できます。

private T GetNumericVal<T>(string sColName, T defVal = new T()) where T : new()

それ以外の場合は、default(T) を使用できます

private T GetNumericVal<T>(string sColName, T defVal = default(T))
于 2012-03-27T13:29:38.833 に答える
4

デフォルト値を設定するのに役立つ質問に答えるには

private T GetNumericVal<T>(string sColName, T defVal = default(T)) 
{
    string sVal = GetStrVal(sColName);
    T nRes;
    if (!T.TryParse(sVal, out nRes))
        return defVal;

    return nRes;
}

ただし、コンパイラは型 T がこの静的メソッドを宣言していることを知る方法がないため、静的 TryParse メソッドを呼び出すことはできません。

于 2012-03-27T13:33:53.750 に答える