Прямое преобразование возвращает InvalidCastException - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть метод с типом возвращаемого универсального значения, который работает с моей базой данных SQLite:

    public static T SelectScalar<T>(string sql)
    {
        // some code...
        var result = command.ExecuteScalar();
        connection.Close();
        return (T)result;
    }

. При вызове его так: SqliteReader.SelectScalar<int>(mysql); InvalidCastException в строке возврата.Что с этим не так?Я новичок в дженериках, скажите, что не так?TIA.

РЕДАКТИРОВАТЬ Снимок экрана с содержанием result: result content

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

ExecuteScalar() возвращает object, в данном случае в штучной упаковке long.

Если вы приведете объект к int, он попытается распаковать .. фактический int. Преобразование long в int будет преобразованием.

Приведение, которое будет работать для этих конкретных линий (но ... не поможет вам):

return (T)(long)result;

Потенциальный дубликат: https://stackoverflow.com/a/3541712/59492

1 голос
/ 09 апреля 2019

очевидно, что тип BigInt не может быть просто приведен к int. Согласно этому сообщению это, кажется,

IIRC вы получаете структуру SqInt32, которая может быть преобразована в Int32

В вашем случае, вероятно, SqInt64 структура. Вам необходимо конвертировать

return (T)Convert.ChangeType(result, typeof(T));

Я бы также предложил ограничить универсальный параметр хотя бы до структур:

public static T SelectScalar<T>(string sql) where T: struct
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...