Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以将整数框入自定义类型对象?_C#_Casting_Boxing - Fatal编程技术网

C# 是否可以将整数框入自定义类型对象?

C# 是否可以将整数框入自定义类型对象?,c#,casting,boxing,C#,Casting,Boxing,可能重复: 我有一个试图装箱的int,以便在构造函数中使用它,该构造函数将其作为CustomType的参数对象 我的意思的一个例子 int x = 5; object a = x; CustomType test = new CustomType(a) //constructor in question public CustomType(CustomType a) { //set some variables etc } 但是,我得到以下错误 The best o

可能重复:

我有一个试图装箱的int,以便在构造函数中使用它,该构造函数将其作为
CustomType
的参数对象

我的意思的一个例子

 int x = 5;
 object a = x;

 CustomType test = new CustomType(a)

 //constructor in question
 public CustomType(CustomType a)
 {
   //set some variables etc
 }
但是,我得到以下错误

 The best overloaded method match for X has some invalid arguments.

所以很明显,我偏离了目标。我哪里做错了?拳击是正确的解决方案还是我应该考虑类型转换?

我不认为拳击或类型转换是你想要的。如果要将整数传递给构造函数,则构造函数的定义应如下所示:

public CustomType(int a) {
}
或者如果你想让它成为一个物体

public CustomType(object a) {
}

您应该使用显式类型转换并为此实现一些运算符。

该构造函数将
自定义类型作为参数;您正在传递一个
int
int
不是
CustomType
,C语言不知道从
int
CustomType
的隐式转换。这就是为什么你会出错

int
强制转换为
对象不会改变它仍然不是
自定义类型的事实

看看那个特殊的构造函数,它是一个复制构造函数。它将自身的类型作为参数。有(人们希望)另一个构造函数接受另一个参数,不管是int,还是您没有提到的其他类型,或者可能没有参数,您只需要在创建默认对象后设置一个属性

至于实际的解决办法,有很多。以下是一些:

  • 向接受
    int
    CustomType
    添加一个额外的构造函数
  • 定义一个函数,该函数将
    int
    作为参数,并返回
    CustomObject
    ;这将是一个您可以使用的“转换”函数
  • 使用默认构造函数
    CustomType
    ,并用整数设置属性(根据
    CustomType
    的作用,可能适用,也可能不适用)

  • 拳击似乎与手头的问题无关。它不是用来传递整数到自定义类型的东西。如果你想知道拳击是什么,它是如何工作的,或者当它有用的时候,然后考虑问一个解决这些问题的问题,因为这个特殊的问题会被拳击A所伤害。这是一个解决方案,没有帮助。

    您的构造函数看起来像复制构造函数(复制对象)

    如果要将对象变量传递给CustomType构造函数,则语法必须为:

    public CustomType(Object a)
     {
       //Unboxing
       int value = (int) a;
     }
    
    使用泛型

    public CustomType<T>(T a)
    {
    //set some variables etc
    }
    
    公共自定义类型(TA)
    {
    //设置一些变量等
    }
    
    您可以将
    int
    框到
    object
    ,但不能将其框到任意类型,并且您不能从框中取出不在框中的内容。例如
    int I=(int)(object)5;
    将起作用,但
    CustomType x=(CustomType)(object)5;
    将不起作用

    您需要一个接受
    int

    public CustomType(int a) {
        ....
    }
    

    顺便说一下,您创建了奇怪的递归。如果唯一的构造函数需要一个
    CustomType
    ,那么您需要另一个
    CustomType
    对象来初始化第一个对象

     CustomType ct = new CustomType(new CustomType(new CustomType(null)));
    

    装箱是将(值的)值类型转换为

  • 直接或间接基类(在
    int
    的情况下,可以是
    ValueType
    类或
    对象
  • 值类型实现的接口(在
    int
    的情况下,可以是
    IComparable
    IFormattable
    IConvertible
    IComparable
    IEquatable
  • 由于您永远无法使
    int
    具有其他基类或实现更多接口,因此无法将
    int
    装箱到
    CustomType

    如果您编写自己的
    struct
    ,那么您就可以决定它实现了什么接口,在这种情况下,
    struct
    的值可以装箱到每个接口类型中。(但是,您不能更改
    struct
    的基类。)

    在类/struct
    CustomType
    中,可以定义from
    int
    CustomType
    ,这样说是合法的

    CustomType ct = 5;
    

    但这不是拳击,只是“看不见的”调用您的
    隐式运算符
    方法。原始对象
    5
    未放入框中;它只是运算符方法的参数。

    您将使用此
    自定义类型
    做什么?您的错误似乎与您提供的代码不匹配。要么是该对象,要么是您提供的示例太离谱了。您可以吗请给出一个更完整的示例说明您正在尝试执行的操作?K;退后一步…您正在尝试执行的操作是什么?如果您想将整数传递给构造函数,则可以使用整数参数..如果您想这样使用,请确保CustomType继承自Object。大多数内容都继承自
    Object
    ,因此我仍然不确定是什么如果你只是想把它转换成int,为什么不首先接受一个
    int
    参数呢?作为一名学生,我们在课堂上看到了装箱和拆箱的原理。有时我们会练习装箱和拆箱值来理解这些原理。所以我猜他的问题是一个理解theo的问题然而,这段代码并没有演示关于装箱的任何原则,装箱似乎也没有在这个问题上实际相关,只是OP认为相关但不相关。在任何情况下,你至少应该指出这是一个迟钝的代码示例来演示…一些东西(同时解释它所演示的内容)而不是像在实际应用程序中实际使用的解决方案那样提出它