Не удалось определить тип делегата Blazor 8

Я переношу свой сервер Blazor с .NET 7 на 8. Очевидно, это вызывает ошибку при вызове функции таким образом:

<input type = "checkbox" class = "form-check" checked = "@isChecked" 
       @onchange = "@((e) => AddRemoveSelection((int)i.Id!, Convert.ToBoolean(e.Value)))" />

Компилятор говорит

Не удалось определить тип делегата

и выделил функцию стрелки => красной подчеркиванием.

Вот метод:

private void AddRemoveSelection(int id, bool isSelected)
{
    if (isSelected)
    {
        // Adding ids to selection
        if (!selectedIds.Any(s => s == id))
        {
            selectedIds.Add(id);
        }
    }
    else
    {
        var s = selectedIds.Find(s => s == id);
        selectedIds.Remove(s);
    }
}

Есть ли какие-либо изменения в Blazor на .NET 8, отключающие этот синтаксис?

Используйте правильную функцию вместо того, чтобы пытаться поместить все в строку. Гораздо проще писать, читать, отлаживать и поддерживать. Как вы теперь будете проверять удостоверение личности и e.Value, если произойдет что-то неожиданное? Например, это Convert.ToBoolean рано или поздно вызовет проблемы. Или вы можете найти лучший способ привязать флажок к свойству с множественным выбором.

Panagiotis Kanavos 20.05.2024 09:36

Это нормально. Проверка генерируется из DTO со значениями по умолчанию, поэтому она никогда не пойдет не так, как пропущенные значения и т. д. Я обнаружил, что это самый простой способ реализовать взаимодействие элементов управления. Вы можете просто проверить идентификатор, поставив точку останова, я не понимаю, зачем из-за этого поднимать такой шум.

Haikal Nashuha 20.05.2024 13:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
198
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не могу сгенерировать ошибку с помощью кода, который вы показываете.

Обычной проблемой, когда вы видите это, является то, что компилятор IDE/Razor запутался. Я считаю, что перезапуск решения обычно исправляет проблему. Перемещение файлов за пределы IDE (скажем, с помощью файлового менеджера) также часто работает.

Вот мой MRE, основанный на вашем коде. Я добавил переработанную версию ввода и метода, которая переносит все преобразования типов в метод.

@page "/"

<PageTitle>Home</PageTitle>

<h1>Hello, world!</h1>

Welcome to your new app.

<input type = "checkbox" class = "form-check" checked = "@isChecked"
       @onchange = "@((e) => AddRemoveSelection((int)i.Id!, Convert.ToBoolean(e.Value)))" />

<input type = "checkbox" class = "form-check" checked = "@isChecked"
       @onchange = "e => AddRemoveSelection1(i.Id, e)" />

@code{
    private bool isChecked;
    private Data i = new();

    private void AddRemoveSelection(int id, bool isSelected)
    {
        // Do something
    }

    // Alternative method
    // let the method do the type conversion work
    private void AddRemoveSelection1(object? id, ChangeEventArgs e)
    {
        //do int convertion
        if (!bool.TryParse(e.Value?.ToString(), out isChecked))
            isChecked = false;
        // Do something
    }

    public class Data
    {
        public int Id { get; set; }
    }
}

По-видимому, эта ошибка возникает только для компонентов (*.razor) за пределами папки компонентов Blazor 8 по умолчанию (Страницы>Компоненты). Когда я перенес эти файлы в папку, проблема была решена вместе с некоторыми исправлениями ссылок.

Надеюсь, это поможет тем, кто столкнется с той же проблемой во время миграции.

Это неправда. Проблема в том, что компилятор IDE/SDK/Razor запутывается. Перезапуск решения обычно исправляет проблему. Перемещение файлов за пределы IDE также часто работает. Попытаемся переместить файлы еще раз.

MrC aka Shaun Curtis 18.05.2024 21:58

@MrCakaShaunCurtis Я попробовал перезапустить IDE, но это не помогло. Только когда я переместил файлы в папку «Компоненты», IDE может указать на некоторые ошибки ссылок («использование» из структуры .NET 7). Без перемещения их в папку IDE не сможет обнаружить реальные проблемы.

Haikal Nashuha 19.05.2024 05:44

Пробовали ли вы переместить файлы за пределы файловой структуры компонентов.

MrC aka Shaun Curtis 19.05.2024 09:28

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

Haikal Nashuha 20.05.2024 09:10

@MrCakaShaunCurtis, можете ли вы записать ответ вместе с некоторыми пояснениями относительно того, что компиляторы IDE/SDK/Razor взорвались? Я отмечу это как ответ.

Haikal Nashuha 20.05.2024 09:20

Я обновил свой первоначальный ответ.

MrC aka Shaun Curtis 20.05.2024 09:35

Другие вопросы по теме