Каково различие между новым Действием () и лямбдой?

Согласно документации react-router-dom

Ссылка: https://reacttraining.com/react-router/web/example/url-params

match стать объектом, который можно использовать в вашем компоненте. Как и объяснение в документации, у вас есть доступ к объекту match со следующими шагами:

  • Route component как this.props.match
  • Route render как ({ match }) => () [1118 ]
  • Route children как ({ match }) => ()
  • withRouter как this.props.match
  • matchPath как return value

Например, если у вас есть следующий маршрут:


В вашем компоненте вы можете получить к нему доступ с помощью: this.props.match, потому что это объект, и внутри него у вас будет то, что вы хотите.

После этого вы можете проверить, какие параметры у вас есть в вашем URL.

Теперь, если вы хотите перенаправить пользователя, вы можете использовать

40
задан George Mauer 20 April 2009 в 02:13
поделиться

2 ответа

Первая версия эффективно работает:

Action tmp = () => _myMessage = "hello";
var action = new Action(tmp);

Проблема, с которой вы сталкиваетесь, заключается в том, что компилятор должен знать, какого рода делегат (или дерево выражений) лямбда-выражения должен быть преобразован в. Вот почему это:

var action = () => _myMessage="hello";

на самом деле не компилируется - это может быть любой тип делегата без параметров и либо без возвращаемого значения, либо с тем же типом возврата, что и _myMessage (который предположительно строка ). Например, все они действительны:

Action action = () => _myMessage="hello";
Func<string> action = () => _myMessage="hello";
MethodInvoker action = () => _myMessage="hello";
Expression<Action> = () => _myMessage="hello";
// etc

Как мог компилятор C # определить, каким должно быть действие типа , если оно было объявлено с помощью var ?

Самый простой способ обойти это при вызове метод (для вашего примера Rhino Mocks) заключается в следующем:

methodOptions.Do((Action) (() => _myMessage = "hello"));
60
ответ дан 27 November 2019 в 01:39
поделиться

Have you verified the second line actually compiles? It should not compile because C# does not support assigning a lambda expression to an implicitly typed variable (CS0815). This line will work in VB.Net though because it supports anonymous delegate creation (starting in VB 9.0).

The Rhino Mocks version does not compile for the same reason the second line should not compile. C# will not automatically infer a type for a lambda expression. Lambda expressions must be used in a context where it is possible to determine the delegate type they are intended to fulfill. The first line works great because the intended type is clear: Action. The Rhino Mocks version does not work because Delegate is more akin to an abstract delegate type. It must be a concrete delegate type such as Action or Func.

For a detailed discussion on this topic, you should read Eric Lippert's blog entries on the subject: http://blogs.msdn.com/ericlippert/archive/2007/01/11/lambda-expressions-vs-anonymous-methods-part-two.aspx

9
ответ дан 27 November 2019 в 01:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: