2010-09-30 49 views
1

我有一個方法(見下文)C#泛型問題

public T ExecuteScalar<T>(string sSql, params SqlParameter[] parameters) 
    { 
     if (!string.IsNullOrEmpty(sSql)) 
     { 
      DataAccess dal = new DataAccess(ConnectionString); 
      DebugOutput_SQL(sSql, parameters); 
      object value = null; 
      value = dal.ExecuteScalar(sSql, parameters); 

      if (value != null && value != DBNull.Value) 
       return (T)value; 
     } 
     return default(T); 
    } 

,我稱之爲

int32 WorkFlowID = DataProvider.ExecuteScalar<Int32>(sSql); 

那麼它給我一個錯誤「不要拆箱看重」排隊「迴歸(T)值「,對此有任何建議。

+0

我們可以看到DataAccess.ExecuteScalar()方法嗎? – 2010-09-30 09:28:07

+0

是來自某種VS插件的錯誤嗎? – leppie 2010-09-30 09:50:56

回答

4

「不要取消裝箱值」聽起來像是一個奇怪的錯誤信息。這正是它所說的嗎?

猜測ExecuteScalar被返回不同的類型(longdouble等),而不是int。嘗試記錄value.GetType(),然後再轉換爲T

正如一個側面說明,這樣的:

object value = null; 
value = dal.ExecuteScalar(sSql, parameters); 

會更簡單(IMO)爲:

object value = dal.ExecuteScalar(sSql, parameters); 

沒有必要把它放在兩個語句在這裏。

編輯:只是爲了澄清,它的失敗的原因是,當你unbox一個值,你必須unbox到實際類型,不只是一個有轉換可用。例如,如果你想最終得到int了,你可以這樣做:

int x = (int) (decimal) value; 

這將拆箱到decimal然後轉換decimalint。在這種情況下,雖然,我只是指定正確的類型,開始與可能的話:)

+0

謝謝喬恩,你是對的,我檢查了十進制類型的值。 – leo 2010-09-30 09:47:32

+1

我很確定你的推理是正確的,但是值得注意的一點是,值類型只能被拆箱到指定的確切類型(例如,即使類型轉換是隱式的,你也不能將int整型爲長整型)。 – 2010-09-30 10:10:24

+0

@Greg:好的電話。將編輯。 – 2010-09-30 10:28:34

0

也許您會收到一個可爲空值對象在這種情況下,你可以做

return ((Nullable<T>)value).Value; 
4

你可以試試:

public T ExecuteScalar<T>(string sSql, params SqlParameter[] parameters) 
{ 
    if (!string.IsNullOrEmpty(sSql)) 
    { 
     DataAccess dal = new DataAccess(ConnectionString); 
     DebugOutput_SQL(sSql, parameters); 
     object value = null; 
     value = dal.ExecuteScalar(sSql, parameters); 

     if (value != null && value != DBNull.Value) 
      return (T) Convert.ChangeType(value, typeof(T)); 
    } 
    return default(T); 
}