Ответ 1
вы можете попробовать отличить это значение...
t += (int)value;
или
t+= Convert.ToInt32(value);
При попытке вызвать эту функцию в моем коде я получаю ошибку в заголовке. Также оператор '+ =' не может быть применен к операндам типа '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);
вы можете попробовать отличить это значение...
t += (int)value;
или
t+= Convert.ToInt32(value);
Вы можете установить ограничение:
public int Change<T>(Stats type, T value) where T : IConvertible
Тогда:
var intValue = value.ToInt32();
Или другим способом (объект не нужен, а не опечатка)
t += (int)(object)value;
Или используйте динамику, используя динамику, вы можете сделать больше, например, неявные приведения
Или использовать Int32 - Int32, а int - внутри структуры. Отсутствие потери производительности
Он не знает, как добавить ваш 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)
Ошибка, которую вы получаете, имеет смысл. Когда вы вызываете метод с int
как тип, компилятор не знает, что это будет так.
Чтобы скомпилировать метод как есть, компилятору нужно будет доказать, что операции, которые вы выполняете на T, будут действительны для всех T - это явно не так.