【问题标题】:Types are the same but needs explicit conversion?类型相同但需要显式转换?
【发布时间】:2020-06-29 00:06:53
【问题描述】:

我有一个表格,其中图像以字节数组的形式上传,如果用户没有提供,则以字节 [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?)

如果有帮助,这里是图片。

显式类型转换它可以工作,但我想知道为什么会发生这种情况。

【问题讨论】:

  • 请用文字代替图片
  • 抱歉,我认为直观地查看错误显示的位置和内容以及图片本身对于问题本身并不是必需的。

标签: c# arrays types


【解决方案1】:

这样做是因为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; }

【讨论】:

    【解决方案2】:

    我理解你的困惑,但是 5 分钟的阅读(他们这么说:))可以揭示面向对象编程的一个非常基本的概念:装箱和拆箱:

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

    还可以查看维基百科对同一概念的看法:

    https://en.wikipedia.org/wiki/Object_type_(object-oriented_programming)

    在您的情况下发生的情况是,字节数组(“pic”列的实际值)被包裹在一个盒子(一个对象实例)中交给您。

    因此;您必须将其拆箱才能获得字节数组。

            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"];
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2014-12-12
    • 2011-10-16
    • 1970-01-01
    相关资源
    最近更新 更多