Почему я не могу сделать действие к действию ?

У меня есть несколько мест, где я использую Action, Action, Action, но когда дело доходит до передачи действия в качестве аргумента в методе класса, я не могу использовать Action или Action to Action<object>. <p> Почему отливка не может быть выполнена простым типом? Возможно ли это приведение? И, наконец, как я могу использовать этот бросок, если это возможно.</p> </object>

3 ответа

Потому что это нарушит безопасность типа.

Когда вы объявляете Action, вы говорите: "Это делегат, для которого требуется один параметр Int32".

Если это можно было бы непосредственно применить к Action<object>, то теперь вы можете вызвать действие с чем-то, что определенно не <code>Int32, например DateTime. В этом случае С# не позволяет вам стрелять в ногу.


Вы не можете сделать прямую трансляцию через ковариацию (или это контравариантность?), Потому что Action в корне не является Action<object> - последнему может быть передан любой объект, тогда как первый может быть передан только <code>int.

Вы можете обойти это, завернув свое действие, что-то вроде:

Action<int> aInt = ...;
Action<object> aObj = o => aInt((int)o); <p> Это снова показывает вам, почему актеры могут быть не очень полезными - если вы передадите <code>aObj</code> ничего, кроме <code>int</code>, вы получите исключение лита.</p> <p> И наоборот, теоретически вы можете просто придать <code>Action&lt;object&gt; &lt;code&gt;Action</code>, потому что, если вы можете передать ему любой объект, вы можете передать его <code>int</code>. Однако на практике это работает только для ссылочных типов, а не для типов значений, поэтому вы можете сделать это со <code>string</code>, но не с <code>int</code>. </object></code></p></object></int>


Действия действия под ограничением, что его ввод является Int32. Это означает, что действие, которое вы используете, может сделать предположения о том, что вход является int. Например, вы можете сделать математику с другим int n => Console.WriteLine(n + 4). Так что действие или функция прекрасно вписывается в это поле. Если вы измените поле, предположения, сделанные ранее, все еще должны удерживаться. У вас в основном есть обратная связь или контравариантность с "обычным" сценарием кастинга, например: object a = (object) 2; ,

Просто помните, что все, что подходит в поле Действие, не должно содержать никаких предположений о поведении его ввода. Функция n => Console.WriteLine(n) плотно прилегает внутрь, потому что все объекты могут быть напечатаны. Не все объекты могут действовать как ints.

licensed under cc by-sa 3.0 with attribution.