是否可以将整数包装到自定义类型对象?

时间:2012-11-07 21:52:45

标签: c# casting boxing

  

可能重复:
  C# Implicit/Explicit Type Conversion

我有一个我试图装箱的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.

所以很明显我离开了标记。我哪里错了?拳击是正确的解决方案还是我应该看类型铸造?

7 个答案:

答案 0 :(得分:2)

我认为拳击或演员不是你想要的。如果要将整数传递给构造函数,则应该像下面这样定义构造函数:

public CustomType(int a) {
}

或者如果你想让它成为一个对象。

public CustomType(object a) {
}

答案 1 :(得分:2)

该构造函数将CustomType类型作为参数;你传递的是intint不是CustomType,C#语言不知道从intCustomType的隐式转换。这就是你收到错误的原因。

int投射到object并不会改变它仍然不是CustomType的事实。

查看该特定构造函数,它是一个复制构造函数。它需要一种自身作为参数。有(希望)另一个构造函数接受另一个参数,无论是int,还是其他未提及的类型,或者可能没有参数,你需要在创建默认对象后设置属性。

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

  1. 向接受CustomType
  2. int添加其他构造函数
  3. 定义一个以int为参数并返回CustomObject的函数;这将是您可以使用的“转换”功能。
  4. 使用CustomType的默认构造函数,并使用您的整数设置属性(可能适用也可能不适用,具体取决于CustomType的内容。
  5. 拳击似乎与手头的问题无关。这不是 用于将整数传递给自定义类型的东西。如果你想更多地了解拳击是什么,它是如何工作的,或者什么时候有用,那么考虑问一个解决这些问题的问题,因为这个特殊的问题会因使用拳击作为解决方案而受到伤害,没有帮助。

答案 2 :(得分:2)

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

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

public CustomType(Object a)
 {
   //Unboxing
   int value = (int) a;
 }

答案 3 :(得分:0)

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

答案 4 :(得分:0)

使用泛型。

public CustomType<T>(T a)
{
//set some variables etc
}

答案 5 :(得分:0)

您可以将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)));

答案 6 :(得分:0)

拳击是将(值的a)值类型转换为

时发生的事情
  1. 直接或间接基类(在int的情况下可以是ValueType类或object
  2. 值类型实现的接口(在int的情况下可以是IComparableIFormattableIConvertibleIComparable<int>或{ {1}})
  3. 由于您永远不能让IEquatable<int>拥有其他基类或实现更多接口,因此无法将int加入int

    如果您编写自己的CustomType,那么 决定它实现的接口,在这种情况下,struct的值可以装入每种接口类型中。 (但是,您无法更改struct的基类。)

    在您的类/结构struct内, 可以定义CustomTypeint的{​​{3}}。通过这种方式,说

    是合法的
    CustomType

    但这不是拳击。这只是对CustomType ct = 5; 方法的“隐形”调用。原始对象implicit operator未放入框中;它只是运算符方法的参数。