web-dev-qa-db-ja.com

暗黙的に型指定されたローカル変数にvoidを割り当てることはできません

var query = rep.GetIp()  // in this line i have the error
           .Where(x => x.CITY == CITY)
           .GroupBy(y => o.Fam)
           .Select(z => new IpDTO
                        {
                            IId = z.Key.Id,
                            IP = z.Select(x => x.IP).Distinct()
                        })
           .ToList().ForEach(IpObj => IpObj.IP.ToList().ForEach(ip => PAINTIP(ip)));

このコードを実行すると、次のエラーが発生します。

暗黙的に型指定されたローカル変数にvoidを割り当てることはできません

グーグルで検索したところ、foreachはLINQ関数ではないため、タイプの問題であることがわかりましたか? voidがどこにあるのかわかりません!

14
Tania1990
  • ForEach()のタイプはvoidです。

  • Select()は_IEnumerable<T>_を返し、ToList()は_List<T>_を返します。

そう:

_List<X> x = ...Select(x => x).ToList(); // List<T>
_

または

_x.ForEach(x => x); // void
_

voidを_List<T>_に割り当てることができないためです。


_var query = rep.GetIp()  // in this line i have the error
           .Where(x => x.CITY == CITY)
           .GroupBy(y => o.Fam)
           .Select(z => new IpDTO
                        {
                            IId = z.Key.Id,
                            IP = z.Select(x => x.IP).Distinct()
                        });

foreach (var dto in query)
{
    foreach (var ip in dto.IP)
    {
        PAINTIP(ip);
    }
}
_

または

_var query = ....
           .SelectMany(z => z.Select(x => x.IP).Distinct());

foreach (var ip in query)
{
    PAINTIP(ip);
}
_
13
abatishchev

ForEach()は何も返しません。そのタイプは無効です。

ForEach() 呼び出しを Select() に置き換えてみてください。

7
jrummell

私はあなたの他の質問を見ました、あなたは同じ質問に対して同様の質問をしました。コードは部分的に次のようになります:

var Q = rep.GetIp()
        .Where(x => x.CITY == CITY)
        .GroupBy(y => o.Fam)
        .Select(z => new IpDTO
        {
          IId = z.Key.Id,
          IP = z.Select(x => x.IP).Distinct()
       });

回答をそのまま使用し、クエリからの戻り値を変数「Q」に割り当てようとしているようです。以前の投稿を確認してください: LINQ IEnumerable <string>の構文

他の人が言っているように、ForEachの戻り値の型は「void」です。変数「Q」がコレクションで初期化されたら、「ForEach」を呼び出す必要があります。

1
Pawan Mishra