1

I have several places where i have Action<Int32>, Action<Boolean>, Action<SomeClassName> being used, but when it comes to passing the action as an argument in a class method, i cannot cast Action<Int32> or Action<Boolean> to Action<Object>.

Why can a cast not be done with a simple type cast? Is this cast possible at all? And lastly, how would i go about this cast if it is possible.


[] creates an array reference, which is a scalar.

my $foo = [1, 2, 3];

Gives the same value of $foo as:

my @bar = (1, 2, 3);
my $foo = \@bar;

See perldoc perlref for more details.

4

3 に答える 3

10

型の安全性が損なわれるためです。

を宣言するAction<Int32>と、「これは 1 つの Int32 パラメーターを必要とするデリゲートです」と言います。

これが に直接キャストできる場合Action<object>Int32たとえばDateTime. この場合、C# を使用すると、自分自身を撃つことができなくなります。

于 2013-07-12T14:25:02.597 に答える
3

Action<int>anは基本的にanではないため、共変性 (または反変性ですか?) を介して直接キャストを行うことはできません。Action<object>後者は任意のオブジェクトを渡すことができますが、前者はanのみを渡すことができintます。

次のようにアクションをラップすることで、これを回避できます。

Action<int> aInt = ...;
Action<object> aObj = o => aInt((int)o);

これは、キャストが良い考えではない理由を再度示しています。aObj以外のものを渡すintと、キャスト例外が発生します。

逆に、理論上はananにキャストできます。ただし、実際には、これは値型ではなく参照型でのみ機能します。したがって、 では実行できますが、では実行できません。Action<object>Action<int>intstringint

于 2013-07-12T14:25:38.327 に答える
1

アクションは、その入力が Int32 であるという制限の下で動作します。これは、使用するアクションが、入力が int であると仮定できることを意味します。たとえば、別の int で計算を行うことができますn => Console.WriteLine(n + 4)。したがって、そのアクションまたは機能は、そのボックスにうまく収まります。ボックスを変更しても、以前に行った仮定は引き続き保持する必要があります。基本的に、「通常の」キャスティング シナリオとは逆の関係、つまり反変性object a = (object) 2;があります。

アクション ボックスに収まるものはすべて、その入力の動作について仮定する必要がないことを覚えておいてください。すべてのオブジェクトを印刷できるため、この機能n => Console.WriteLine(n)は内部にぴったりと収まります。すべてのオブジェクトが int のように動作できるわけではありません。

于 2013-07-12T14:31:43.393 に答える