无法将类型'T'隐式转换为'Int'

时间:2011-11-17 16:34:33

标签: c# .net generics

尝试在我的代码中调用此函数时,我会在标题中看到错误。运算符'+ ='也不能应用于'int'和'T'

类型的操作数
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);

6 个答案:

答案 0 :(得分:13)

您可以尝试像这样投射价值......

t += (int)value; 

t+= Convert.ToInt32(value);

答案 1 :(得分:6)

您可以设置约束:

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

然后:

var intValue = value.ToInt32();

答案 2 :(得分:4)

或另一种方式(对象强制转换不是拼写错误)

t += (int)(object)value;

或者使用动态,通过使用动态你可以做更多,比如隐式演员

或者使用Int32 - Int32和int都是内部结构。没有性能损失

答案 3 :(得分:1)

它不知道如何将T添加到数字中,因为它不知道T的类型是什么。

t += Convert.ToInt32(value);

但是,既然您要将int添加到int并返回int,那么为什么不放弃通用参数并将其设为

public int Change(Stats type, int value)  

如果你想要不同类型的不同行为并且真的想要相同的方法名称,而不是只测试类型:

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

答案 4 :(得分:0)

你得到的错误很明显。当您使用int作为类型调用方法时,编译器不知道是这种情况。

要按原样编译方法,编译器需要证明你在T上执行的操作对所有T都有效 - 显然不是这种情况。

答案 5 :(得分:0)

我有一个非常相似的问题。这并不是这里要问的问题,但这可能是一个起点:

    private T GetXValue<T>(XElement xElem, string name)
    {
        try
        {
            object o = xElem.Element(name).Value;
            return (T)Convert.ChangeType(o, typeof(T));
        }
        catch 
        {
            return (T)Activator.CreateInstance(typeof(T), null);
        }
    }