c# - 尝试了解类型转换和装箱/拆箱

标签 c# casting boxing

我目前正在尝试了解选角和拳击。据我目前的理解:

  • 装箱 - 值类型到引用类型(即 int 到对象)
  • 拆箱 - 引用类型到值类型(即对象到 int)
  • 类型转换 - 目前在我看来类似于拳击,但是 允许您指定您想要引用的对象类型 类型为。 (即int到customObjectType)

我目前正在使用的示例是为了尝试解决它。 假设我有 2 个类,一个类中的方法调用另一个类的构造函数。

//1st class
public class FirstClass
{
  //code for fields,constructor & other methods

  public void CallOtherClass(int firstClassID)
  {
   int x = firstClassID;
   SecondClass test = new SecondClass(x);
  }

}

//2nd class
public class SecondClass
{
   public SecondClass(FirstClass firstClass)
   {
    //set some fields
   }
} 

好吧,在上面的场景中我们会遇到一个问题,因为 CallOtherClass 方法尝试设置 SecondClass 的构造函数,但是 SecondClass 的构造函数采用 FirstClass 类型的参数,而我们只能提供一个 int 。

据我了解,这是使用类型转换的好时机?如下所示。

//1st class
public class FirstClass
{
  //code for fields,constructor & other methods

  public void CallOtherClass(int firstClassID)
  {
   int x = firstClassID;

   FirstClass a;
   a = (FirstClass)x;

   SecondClass test = new SecondClass(a);
  }

}

//2nd class
public class SecondClass
{
   public SecondClass(FirstClass firstClass)
   {
    //set some fields
   }
}

在我看来,这似乎是将 x 的类型更改为 FirstClass 的引用类型。显然我的理解有些偏离,因为它会产生错误

"Cannot convert type 'int' to 'Namespace.FirstClass"

有什么想法吗?

最佳答案

类型转换不是装箱或拆箱,但它可能会导致其中任何一个。 由于 int 不是 FirstClass,也就是说,int 不会继承或扩展 FirstClass,因此您无法将其转换为 FirstClass 类型。

只有在可能的情况下,类型转换才会导致转换。 因此,您可以从 int 转换为 double,反之亦然,但可能会产生副作用。但您无法从 int 转换为 FirstClass

装箱,将值或引用类型包装在包装对象中。至少我是这么认为的。不确定内部是如何工作的,但我的猜测是赋值运算符“=”或强制转换在拆箱时隐式返回包装的值,在装箱时返回包装器对象。

关于c# - 尝试了解类型转换和装箱/拆箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13262024/

相关文章:

c# - NetDataContractAttribute 与 DataContractAttribute?

c# - Linq orderby bool 值

c# - 为什么要调用这个虚方法呢?

java - 如何在此代码中将 int 更改为 double ?

java - Java 中按原语或装箱类进行 foreach 循环

Scala 2.10、Double.isNaN 和拳击

c# - NLog Header(忽略布局)

c# - 基于字符串的动态转换

java - 为什么我们需要将 long 转换为 byte。现实世界中有这种方法的例子吗?

c# - Nullable<T> 的装箱/拆箱行为如何可能?