繁体   English   中英

为什么我需要在这里使用 Lambda 表达式?

[英]Why do I need to use a Lambda expression here?

网格.razor:

@foreach (var row in Rows)
{
    <tr @onclick="@(() => OnRowClick(row))">
        @GridBody(row)
    </tr>
}

网格.razor.cs

namespace MyApp.Web.Components.Grid
{

    public class GridRow<TItem>
    {
        public TItem Item { get; set; } = default!;
        public int Id { get; set; } = default!;
        public bool Active = false;
    }

    public partial class Grid<TItem>
    {
        [Parameter]
        public int PageSize { get; set; } = 100;

        [Parameter]
        public RenderFragment GridHeader { get; set; } = default!;

        [Parameter]
        public RenderFragment<GridRow<TItem>> GridBody { get; set; } = default!;


        public async Task OnRowClick(GridRow<TItem> row)
        {
            //...        
        }
    }
}

一切都按预期工作。 但是我不清楚 Grid.razor 中的以下代码行:

<tr @onclick="@(() => OnRowClick(row))">

上面的工作,但最初我尝试了以下操作:

<tr @onclick="@(OnRowClick(row))">

如果没有 lambda 表达式,编译器会产生以下错误:

Argument 2: cannot convert from 'System.Threading.Tasks.Task' to 'Microsoft.AspNetCore.Components.EventCallback'

为什么这里需要 lamda function?

当您使用OnRowClick(row)时,您直接调用OnRowClick function 并将结果分配给onclick 使用() => OnRowClick(row)将 lambda function 分配给onclick ,以便以后可以调用它(因此调用OnRowClick )。

onclick视为变量,这是您在 C# 中看到的差异:

Task<SomeType> onclick = OnRowClick(row); // Invoked now, onclick contains the result

对比

Func<Task<SomeType>> onclick = () => OnRowClick(row); // Can be invoked later

如果row不需要作为参数,您可以简写,例如@onclick=@OnRowClick ,因为您将传递一个 function 可以稍后调用而不是现在调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM