错误CS1660:无法将lambda表达式转换为类型'bool',因为它不是委托类型

时间:2019-12-10 10:37:40

标签: blazor blazor-server-side

多年来,这一直使我发疯。我使用了以下工作代码

<input @onchange="@((ui) => Console.WriteLine(ui.Value))" />

并将其复制到新的blazor组件项目。然后我开始得到错误

error CS1660: Cannot convert lambda expression to type 'bool' because it is not a delegate type

5 个答案:

答案 0 :(得分:2)

由于这浪费了我很多时间,而且错误非常容易误导我以为我会写出来。

问题是缺少@using,在其中添加了以下内容,一切正常。

@using Microsoft.AspNetCore.Components.Web

我猜想该命名空间中有一些扩展方法,可以使魔术在剃刀生成的代码中起作用...

答案 1 :(得分:2)

不幸的是,添加@using语句对我不起作用。显然,您现在必须直接在引号内定义lambda表达式,而不必将其包装在@(...)中,如下所示:

<input @onchange="changeEventArgs => Console.WriteLine(changeEventArgs.Value)" />

有关示例,请参见此参考: https://docs.microsoft.com/en-us/dotnet/architecture/blazor-for-web-forms-developers/components#event-handlers

答案 2 :(得分:0)

这浪费了我很多时间。

对我来说Visual Studio添加了对我正在调用的子组件的忽略。

我从csproj中删除了忽略项,它按预期工作

答案 3 :(得分:0)

注意:此答案基于 Blazor 客户端;但是,它也可能对 Blazor 服务器端有所帮助。

在我的例子中,我无法让 lambda 表达式起作用,但我仍然需要有一个参数来传递给下一个方法,所以我最终使用了 Action<T>()。这也适用于自定义组件。我已经根据我使用的内容稍微修改了这个,因为我使用的是枚举而不是 bool。

<MyCustomInput Value="@ValueToChange" ValueExpression="(() => ValueToChange)" ValueChanged="(new Action<bool>(async x => await OnValueChanged(x)))" />

@code {
    public bool ValueToChange { get; set; }

    private async Task OnIdCountryChanged(bool newValue) {
        ValueToChange = newValue;
    }
}

如果您使用的是自定义组件,则该组件中将需要以下内容。

[Parameter]
public bool Value { get; set; } = default;

[Parameter]
public EventCallback<bool> ValueChanged { get; set; }

[Parameter]
public Expression<Func<bool>> ValueExpression { get; set; }

答案 4 :(得分:0)

就我而言,我已经删除了 Shared

中的 _Imports.razor using 语句
@using {MyProjectName}.Shared

我把它加回来了,一切都很好。

enter image description here