Что делает оператор '=>', означают в C#?

Это ошибка компиляции или времени выполнения? Если это время компиляции. Убедитесь, что XAML (при условии, что есть XAML) имеет правильное пространство имен и что элемент управления представлением того же типа, что и унаследованный тип в. то есть UserControl следует прочитать ReactiveUserControl в сценарии XAML.

зацепил с самого начала:

<reactiveui:ReactiveUserControl
  x:Class="ReactiveDemo.NugetDetailsView"
  xmlns:reactiveDemo="clr-namespace:ReactiveDemo"
  x:TypeArguments="reactiveDemo:NugetDetailsViewModel"
  xmlns:reactiveui="http://reactiveui.net"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Grid>
      <Grid.ColumnDefinitions>
          <ColumnDefinition Width="Auto" />
          <ColumnDefinition Width="*" />
      </Grid.ColumnDefinitions>
      <Image x:Name="iconImage" Margin="6" Width="64" Height="64"
             HorizontalAlignment="Center" VerticalAlignment="Center"/>
      <TextBlock Grid.Column="1" TextWrapping="WrapWithOverflow" 
                 Margin="6" VerticalAlignment="Center">
          <Run FontSize="14" FontWeight="SemiBold" x:Name="titleRun"/>
          <LineBreak />
          <Run FontSize="12" x:Name="descriptionRun"/>
          <LineBreak />
          <Hyperlink x:Name="openButton">Open</Hyperlink>
      </TextBlock>
  </Grid>
</reactiveui:ReactiveUserControl>
6
задан jason 14 October 2009 в 23:46
поделиться

4 ответа

В основном это указывает анонимную функцию, которая не берет параметров, который называет SomeAction. Таким образом да, они функционально эквивалентны. Хотя не равный. Используя лямбду более эквивалентно:

del = new SomeDelegate(this.CallSomeAction);

где CallSomeAction определяется как:

public void CallSomeAction()
{
    this.SomeAction();
}

Надежда, которая помогает!

7
ответ дан 8 December 2019 в 13:49
поделиться

Они делают то же самое, но" () =>..." синтаксис - то, что называют лямбда-выражением, и как таковой совпадает с анонимной функцией. Вы могли, вероятно, не учесть часть делегата в целом и просто позволить компилятору вывести тип делегата для Вас.

del = this.SomeAction;

В зависимости от того, какой тип "del" является seclared как.

Править

Используя лямбды или анонимные методы или просто обычный метод для начинающих позволяет Вам отобразить методы, которые не имели подписи делегата делегату.

Например, скажите, что у Вас есть делегат с подписью bool myDelegate (интервал, интервал), но Вы хотели иметь метод с подписью bool myMethod (строка, строка) обрабатывают делегата. Вы могли затем использовать лямбда-выражение, чтобы позволить Вам сделать, это встраивает с коротким синтаксисом как так.

delegate bool myDelegate(int x, int y);

// With lambdas... 
myDelegate del = (int a, int b) => myMethod(a.ToString(), b.ToString());

// With anonymous methods...
myDelegate del2 = delegate(int a, int b) { return myMethod(a.ToString(), b.ToString()); };

// The good ol' way without lambdas or anonymous methods...
myDelegate del3 = SomeDelegateHandler;

... then write a method somewhere else ...

// Handler method
private bool SomeDelegateHandler(int a, int b)
{
  return myMethod(a.ToString(), b.ToString());
}

Таким образом, поскольку Вы видите лямбды, и анонимные методы являются в основном просто более коротким/встроенным способом сделать метод для обработки делегата. В Вас случай Вы, возможно, не должны были бы делать дополнительный метод. Это просто зависит от того, если подпись делегата совпадает с Вашей сигнатурой метода, и мне, кажется, что это.

4
ответ дан 8 December 2019 в 13:49
поделиться

"=>" может быть считан, "переходит в" (источник: Eric Lippert), и просто разделяет аргумент (аргументы) от операции в лямбда-выражении. В этом случае лямбда является излишеством. Лучшие примеры были бы:

var subList = list.FindAll(item => item.Type == "Foo");

(найдите все объекты, где типом объекта является Foo),

и т.д. В C# 2.0, это может также быть записано:

var subList = list.FindAll(delegate(SomeType item) {
   return item.Type == "Foo";});

И быстрый способ выражения "встроенная" функция, также предлагая поддержку "закрытия" - т.е. это могло также быть:

string itemType = ...
var subList = list.FindAll(item => item.Type == itemType);

Чтобы сделать это иначе потребовало бы, чтобы тип-definiton передал в типе изделия:

class Searcher {
    public string itemType;
    public bool Find(SomeType item) {return item.Type == itemType;}
}
...
Searcher searcher = new Searcher();
searcher.itemType = ...
var subList = list.FindAll(searcher.Find);

На самом деле это в значительной степени точно, что компилятор делает для нас (и для "делегата" и для использования лямбды). Самое большое различие - то, что лямбда может также выразить Expression, например, для LINQ.

4
ответ дан 8 December 2019 в 13:49
поделиться

=> Оператор Лямбды, лямбда-выражения похожи на эволюцию C# 2.0 анонимные методы.

Можно использовать анонимные методы и лямбда-выражения очень похожим способом создать экземпляры делегата:

Func<string,int> wordCount;
wordCount = delegate (string text) { return text.Split().Length; };
Console.WriteLine (wordCount("Hello World"));

Используя лямбда-выражения:

Func<string,int> wordCount;
wordCount = (string text) => { text.Split().Length; };
Console.WriteLine (wordCount("Hello World"));
2
ответ дан 8 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

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