2011-11-17 77 views
11

當試圖在我的代碼中調用此函數時,我在標題中出現錯誤。也算「+ =」不能應用於類型「詮釋」的操作數和「T」無法將類型'T'隱式轉換爲'Int'

public int Change<T>(Stats type, T value) 
    { 
     Dictionary<string, string> temp = new Dictionary<string, string>(); 
     temp = sql.Query(string.Format("SELECT {0} FROM player WHERE fbId='{1}'", type.ToString(), FBId)); 
     if (typeof(T) == typeof(int)) 
     { 
      int t = Convert.ToInt16(temp[type.ToString()]); 
      t += value; 
      if (t < 0) return -1; 
      PlayerStats[type] = t; 

     } 
     sql.Upload(string.Format("UPDATE player SET {0}='{1}' WHERE fbId='{2}'", type.ToString(), PlayerStats[type], FBId)); 
     return 0; 
    } 

我通過調用該函數:

Change<int>(type, 1); 
+15

如果這個方法不是通用的,這個方法是通用的嗎? – dlev

+0

如此明確地轉換它? –

+3

Bobby Tables不會破壞您的數據庫,您有多自信? –

回答

9

你可以嘗試鑄造這樣的價值...

t += (int)value; 

t+= Convert.ToInt32(value); 
+0

你需要導入什麼才能使用'Convert'? –

+1

'(int)value'將不起作用。它會給出錯誤「無法將類型'T'轉換爲'int'」 –

5

您可以設置約束:

public int Change<T>(Stats type, T value) where T : IConvertible 

然後:

var intValue = value.ToInt32(); 
1

它KN不知道如何將T添加到數字中,因爲它不知道T將會是什麼類型。

t += Convert.ToInt32(value); 

但是,由於要添加intint和返回int那麼爲什麼不直接溝泛型參數,使之

public int Change(Stats type, int value) 

,如果你想爲不同類型的不同的行爲,真正想的一樣方法名稱,而不是測試類型只是:

public int Change(Stats type, string value) 
public int Change(Stats type, DateTime value) 
+0

因爲我可能會通過int,一個bool,一個字符串。當我需要Change()時,這一切都會有所不同。 –

+0

@大衛,這個建議是有效的。到目前爲止,您向我們展示了您想要爲整數執行的自定義邏輯。至少,你可以考慮讓'Change(Stats type,int value)'和'Change (Stats type,T value)'過載。當類型對操作無關緊要時,泛型非常有用。你已經向我們展示了一個類型*確實重要的例子。 –

+0

你只是使用泛型類型來定義方法的邏輯/流,也可能會創建一些重載,至少你會得到一個編譯器檢查你沒有通過一個無效的類型,你將無法依靠泛型類型如果你打開所有提到的類型,就會受到限制。 –

0

您是ge的錯誤tting讓人心動。雖然你調用的方法與int作爲類型,編譯器不知道是這樣。

要編譯該方法,編譯器需要證明你在T上執行的操作對所有T都是有效的 - 顯然不是這種情況。

2

或者另一種方式(對象轉換是必要的不錯字)

t += (int)(object)value;

或者使用動態,通過使用動態可以做到更多,比如隱式轉換

或者使用Int32 - Int32和int都是內部結構的。沒有性能損失

+0

不知道是否將Boxing /拆箱轉換添加到明確使用整數的泛型函數是一個好主意。 – Jviaches

相關問題