Типы одинаковы, но нужно явное преобразование? - PullRequest
0 голосов
/ 18 марта 2020

У меня есть таблица, в которую изображение загружается в виде байтового массива или байта [0], если пользователь его не предоставляет.

cmd.Parameters.AddWithValue("@pic", string.IsNullOrEmpty(updateObj.image) ? new byte[0] : Convert.FromBase64String(updateObj.image.Split(',').Last()));

Однако, когда я извлекаю данные обратно, оно говорит, что типом является 'объект', хотя .GetType() возвращает System.Byte[].

Вот тип получаемой мной ошибки:

byte[] b = new byte[0];
Console.WriteLine("reader[pic] type is " + reader["pic"].GetType());
Console.WriteLine("b type is " + b.GetType());

отображается как:

reader[pic] type is System.Byte[]
b type is System.Byte[]

но пытается:

b = reader["pic"]

показывает:

Cannot implicitly convert type 'object' to 'byte[]'. An explicit conversion exists (are you missing a cast?)

Вот изображения, если они помогают. Cannot implicitly convert type console

Явное приведение типов работает, но я хотел бы знать, почему это происходит.

Ответы [ 2 ]

3 голосов
/ 18 марта 2020

Это происходит потому, что object является типом возврата индексатора SqlDataReader

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqldatareader.item?view=netframework-4.8#System_Data_SqlClient_SqlDataReader_Item_System_Int32_

public override object this[string name] { get; }
1 голос
/ 18 марта 2020

Я понимаю ваше замешательство, но 5-минутное чтение (так говорят :)) может раскрыть очень основную c концепцию объектно-ориентированного программирования: Бокс и распаковка:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/boxing-and-unboxing

А также проверьте, что википедия может сказать о том же понятии:

https://en.wikipedia.org/wiki/Object_type_ (объектно-ориентированное программирование)

В вашем случае происходит передача байтового массива (фактическое значение столбца «pi c»), завернутого в коробку (экземпляр объекта).

Следовательно; Вы должны распаковать его, чтобы получить байтовый массив.

        byte[] b = new byte[0];

        Console.WriteLine("reader[pic] type is " + reader["pic"].GetType());
        Console.WriteLine("b type is " + b.GetType());

        b = (byte[])reader["pic"];

        // or, for reference types:

        b = reader["pic"] as byte[];

И почему вы упаковываете его в коробку?

Потому что, как вы можете получить байт [] от вашего читателя ( возможно, одна из реализаций IDataReader, например, SqlDataReader, путем обращения к ее индексатору, вы также можете получить целое число, строку или любой тип, поддерживаемый перечислением SqlDbType.

        // for value types, an explicit cast is required
        int customerAge = (int)reader["age"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...