2011-11-17 909 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

相关问题