2

可能重复:
C# 隐式/显式类型转换

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

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

4

7 回答 7

2

我不认为拳击或铸造是你要找的。如果你想将一个整数传递给你的构造函数,你的构造函数应该这样定义:

public CustomType(int a) {
}

或者,如果您希望它成为一个对象。

public CustomType(object a) {
}
于 2012-11-07T21:56:55.047 回答
2

该构造函数将CustomType类型作为参数;你正在传递一个int. Anint不是 a CustomType,并且 C# 语言不知道从intto的隐式转换CustomType。这就是你收到错误的原因。

将 theint转换为 anobject并不会改变它仍然不是 a 的事实CustomType

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

至于实际的解决方案,有很多。这里有几个:

  1. 添加一个额外的构造函数来CustomType接受一个int.
  2. 定义一个以 aint作为参数并返回 aCustomObject的函数 这将是您可以使用的“转换”功能。
  3. 使用默认构造函数CustomType并使用整数设置属性(可能适用也可能不适用,具体取决于具体CustomType操作。

拳击似乎与手头的问题无关。您不应该使用它来将整数传递给自定义类型。如果您想更多地了解拳击是什么、它是如何工作的,或者它何时有用,那么请考虑提出一个解决这些问题的问题,因为使用拳击作为解决方案会损害这个特定的问题,而不是帮助。

于 2012-11-07T21:57:28.253 回答
2

您的构造函数看起来像一个复制构造函数(用于复制对象)。

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

public CustomType(Object a)
 {
   //Unboxing
   int value = (int) a;
 }
于 2012-11-07T21:57:31.080 回答
0

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

于 2012-11-07T21:57:06.560 回答
0

使用泛型。

public CustomType<T>(T a)
{
//set some variables etc
}
于 2012-11-07T21:58:19.900 回答
0

您可以装箱但不能装任意类型,并且您不能从盒子中取出不在盒子里的东西intobjectint i = (int)(object)5;会工作,但CustomType x = (CustomType)(object)5;不会工作。

你需要一个构造函数接受int

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

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

 CustomType ct = new CustomType(new CustomType(new CustomType(null)));
于 2012-11-07T22:00:16.340 回答
0

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

  1. 直接或间接基类(在这种情况下int可能是ValueType类或object
  2. 值类型实现的接口(在这种情况下int可以是IComparable, IFormattable, IConvertible, IComparable<int>, 或IEquatable<int>

由于您永远无法int拥有其他基类或实现更多接口,因此无法将一个装箱intCustomType.

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

在您的类/结构CustomType,可以定义从to的隐式转换。这样的话就合法了intCustomType

CustomType ct = 5;

但这不是拳击。这只是对您的implicit operator方法的“隐形”调用。原物5不放入盒子中;它只是您的运算符方法的参数。

于 2012-11-07T22:33:43.943 回答