Невозможно неявно преобразовать тип 'T' в 'Int'

При попытке вызвать эту функцию в моем коде я получаю ошибку в заголовке. Также оператор '+ =' не может быть применен к операндам типа '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);

Ответ 1

вы можете попробовать отличить это значение...

t += (int)value; 

или

t+= Convert.ToInt32(value);

Ответ 2

Вы можете установить ограничение:

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

Тогда:

var intValue = value.ToInt32();

Ответ 3

Или другим способом (объект не нужен, а не опечатка)

t += (int)(object)value;

Или используйте динамику, используя динамику, вы можете сделать больше, например, неявные приведения

Или использовать Int32 - Int32, а int - внутри структуры. Отсутствие потери производительности

Ответ 4

Он не знает, как добавить ваш 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)  

Ответ 5

Ошибка, которую вы получаете, имеет смысл. Когда вы вызываете метод с int как тип, компилятор не знает, что это будет так.

Чтобы скомпилировать метод как есть, компилятору нужно будет доказать, что операции, которые вы выполняете на T, будут действительны для всех T - это явно не так.