Аргумент типа лямбда-выражения не может быть выведен - PullRequest
0 голосов
/ 07 ноября 2018

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

данный метод этого метода:

public static void DoNothing(string v)
{
    // do nothing
}

Попытка выполнить его таким образом выдает ошибку " аргументы типа для метода .. не может быть выведена. Попробуйте указать аргументы типа явно. ":

myList.Select(x => DoNothing(x)); // does not work
var r = myList.Select(x => DoNothing(x)); // just a ?

Однако, как только он что-то возвращает, т. Е.

private static string ReturnString(string v)
{
    return v;
}

это прекрасно работает:

myList.Select(x => ReturnString(x)); // works
var r = myList.Select(x => ReturnString(x)); // IEnumerable<string>

так что я думаю, это как-то связано с типом возврата void?

могу ли я никогда не работать из-за того, что ничего не возвращено, или есть какой-то магический синтаксис, который я пропускаю / не могу понять (!)

Единственный способ, которым я могу заставить это работать, заключается в следующем:

foreach (var item in myList)
{
    DoNothing(item);    // works fine.
}

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

В качестве дополнения к ответу Криса вы можете поддерживать текущий синтаксис, используя метод ForEach LINQ (при условии, что myList - это на самом деле список).

myList.ForEach(x => DoNothing(x));
0 голосов
/ 07 ноября 2018

Метод Select ожидает, что лямбда-выражение в нем вернет значение. Поскольку DoNothing(v) является void методом, он вообще ничего не возвращает.

Сообщение об ошибке исходит из общего вывода, где попытается определить тип переменной, вызванной вызовом Select, на основе результата выражения в нем. Но так как нет возвращаемого типа (void не считается), он жалуется.

Представьте, если вы приковали цепью еще один Select или Where, позвоните по этому номеру:

myList.Select(x => DoNothing(x)).Where(v => ????); //what is "v" here? void? That doesn't work

var value = myList.Select(x => DoNothing(x)).First(); //what is "value" here? void?

Так что вы можете видеть, как это просто не получается.

Как только вы обновите его для вызова ReturnString, логический вывод обнаружит тип возврата string, и все будет хорошо.

myList.Select(x => ReturnString(x)).Where(v => v == "Hello World!"); // "v" is a string here, everything is fine.

string value = myList.Select(x => ReturnString(x)).First(); //what is "value" here? It's a "string" type as specified by "ReturnString"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...