2012-03-27 83 views
12

是否可以編寫類似的構造?
我想設置,不知何故,默認值類型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; 
    }    
} 

回答

15

我沒有試過這個,但是將T defVal = 0更改爲T defVal = default(T)

4

如果你知道T將hav EA參數構造函數可以使用新的T()這樣:

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

否則,你可以使用默認(T)

private T GetNumericVal<T>(string sColName, T defVal = default(T)) 
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; 
} 

但是你不能調用靜態TryParse方法,因爲編譯器無法知道類型T聲明瞭這個靜態方法。

+0

是的,我無法撥打TryParse。但也許有類似的東西?也許給類型參數添加一些約束(我的意思是'where:...')?如果數字類型實現一些轉換接口。 – hardsky 2012-03-27 13:47:30

+0

CLR沒有「虛擬靜態方法」的概念,編譯器不能從一個類型推斷靜態方法。據我所知,沒有乾淨的解決方案。 – 2012-03-27 14:11:08

+0

http://stackoverflow.com/questions/196661/calling-a-static-method-on-a-generic-type-parameter瞭解更多詳情 – 2012-03-27 14:12:00