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は ではなく、C# 言語は からへCustomTypeの暗黙的な変換を認識していません。そのため、エラーが発生します。 intCustomType

を にキャストしintobjectも、まだ ではないという事実は変わりませんCustomType

その特定のコンストラクターを見ると、それはコピー コンストラクターです。それ自体の型をパラメーターとして取ります。int であるか、言及していない他の型であるか、またはパラメーターがない可能性があるかどうかにかかわらず、別のパラメーターを取る別のコンストラクターがあり (希望する場合があります)、デフォルト オブジェクトを作成した後にプロパティを設定するだけで済みます。

実際の解決策については、たくさんあります。ここにいくつかあります:

  1. CustomTypeを受け入れる追加のコンストラクターを に追加しますint
  2. intをパラメーターとして取り、 を返す関数を定義しますCustomObject。これは、使用できる「変換」機能になります。
  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

ボクシングは、(値の)値型を次のいずれかに変換すると発生します

  1. 直接または間接の基本クラス (その場合は、クラスまたはクラスでintある可能性がありますValueTypeobject
  2. 値の型が実装するインターフェース ( 、、、またはのintいずれかの場合)IComparableIFormattableIConvertibleIComparable<int>IEquatable<int>

int他の基本クラスを作成したり、より多くのインターフェイスを実装したりすることはできないため、 を にボックスint化することはできませんCustomType

独自structに作成する場合は、実装するインターフェイスを決定します。その場合、値をそれらstructのインターフェイス タイプのそれぞれにボックス化できます。(ただし、 a の基本クラスは変更できませんstruct。)

クラス/構造体の内部CustomType、からへの暗黙的な変換を定義できます。このように、言うのは合法になりますintCustomType

CustomType ct = 5;

しかし、それはボクシングではありません。implicit operatorこれは、メソッドへの「見えない」呼び出しにすぎません。元のオブジェクト5はボックスに入れられません。これは、オペレーター メソッドへの単なる引数です。

于 2012-11-07T22:33:43.943 に答える
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)));
于 2012-11-07T22:00:16.340 に答える
0

明示的な型変換を使用し、そのためにいくつかの演算子を実装する必要があります。

于 2012-11-07T21:57:06.560 に答える
0

ジェネリックを使用します。

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