Squeak.ru - шаблоны программирования

Task.Factory.StartNew() перегружает

У меня очень простой код:

static void Main(string[] args)
{
    var task = Task.Factory.StartNew(GetInt);

    var task2 = Task.Factory.StartNew(
        () =>
        {
            return GetInt();
        });
}

static int GetInt()
{
    return 64;
}

Почему я получаю ошибку компилятора для первой задачи? Сигнатуры методов (без параметров, тип возвращаемого значения int) равны, не так ли?

Я знаю решение (довольно простое: var task = Task.Factory.StartNew<int>(GetInt);), но я хотел бы знать, в чем проблема с приведенным выше кодом.

05.04.2012

  • Пожалуйста, попробуйте сами, у меня есть только текст ошибки немецкого компилятора: Der Aufruf unterscheidet nicht eindeutig zwischen folgenden Methoden und Eigenschaften: "System.Threading.Tasks.TaskFactory.StartNew<int>(System.Func<int>)" und "System.Threading.Tasks.TaskFactory.StartNew(System.Action)", но это не имеет смысла, потому что GetInt вернет int, а не void 05.04.2012

Ответы:


1

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

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

Подпись метода в C#

05.04.2012
  • Я думаю, вам действительно нужно перефразировать свой ответ: действие сильно отличается от типа Func‹TResult›. Ваш ответ в настоящее время читается так, как будто реализация StartNew не должна даже компилироваться. 05.04.2012

  • 2

    Потому что компилятор не может решить, какую из этих двух перегрузок использовать:

    StartNew(Action)
    StartNew<TResult>(Func<TResult>)
    

    Причина этого в том, что тип возвращаемого значения не является частью разрешения перегрузки в C# (точно так же, как у вас не может быть двух перегрузок, отличающихся только типами возвращаемого значения), и поэтому компилятор не может решить, должно ли GetInt быть Action или Func<T>. . Принудительное использование универсальной версии путем вызова StartNew<int>(GetInt) предоставит необходимую информацию.

    05.04.2012
  • Это определенно лучшее решение. 31.10.2013

  • 3

    Для справки, вот еще два способа сделать это (которые компилируются):

    var task3 = Task.Factory.StartNew((Func<int>)GetInt);
    var task4 = Task.Factory.StartNew(() => GetInt());
    
    05.04.2012

    4

    Помогло бы показать исключение: "Вызов неоднозначен между следующими методами или свойствами: "System.Threading.Tasks.TaskFactory.StartNew(System.Action)" и "System.Threading.Tasks.TaskFactory.StartNew( System.Func)'"

    Если вы посмотрите, есть два возможных метода:

    public Task<TResult> StartNew<TResult>(Func<TResult> function);
    public Task StartNew(Action action);
    

    Если вы добавите <int> или предоставите Func<int>, вы заставите его взять первую подпись. Без этого ваш код неоднозначен.

    05.04.2012

    5

    Вы получаете ошибку компиляции, потому что метод StartNew принимает предикаты Action (возвращает void) или Func (возвращает что-то) с различными перегрузками, а не прямым делегатом.

    05.04.2012
  • Это звучит как махание рукой, предоставление <int> для параметра универсального типа никоим образом не делает делегата более похожим на Action<T> или Func<T>, поэтому, очевидно, он может сам вывести эту часть. 05.04.2012
  • Предоставление ‹int› делает вызов абсолютно однозначным. Нет подписи Task<TResult> StartNew<TResult>(Action). 05.04.2012
  • @ LasseV.Karlsen, не знаю, почему ты так думаешь. Я получаю 2 ошибки времени компиляции при компиляции кода - первая говорит, что тип возврата для GetInt неверен. Поэтому вам нужно переписать вызов как code var task2 = Task.Factory.StartNew(() => GetInt());code, который является сокращенной версией codevar task = Task.Factory.StartNew(new Func‹int›(GetInt );code. 05.04.2012

  • 6

    Как утверждают другие, вам нужно передать GetInt как функцию в StartNew или указать, что вы собираетесь возвращать значение из StartNew, указав универсальный тип. В противном случае компилятор понятия не имеет, какую задачу вы собираетесь создать... это неоднозначно.

    static void Main(string[] args)
    {
        var task = Task.Factory.StartNew<int>(GetInt);
    
        var task2 = Task.Factory.StartNew(
            () =>
            {
                return GetInt();
            });
    }
    
    static int GetInt()
    {
        return 64;
    }
    
    05.04.2012
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

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

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...