1. ホーム
  2. c#

[解決済み] C#:foreach内のyield returnが失敗する - bodyはイテレータブロックにできない

2022-02-26 01:01:32

質問

この難読化されたコードの一部を考えてみましょう。このコードでは、匿名コンストラクタと yield return それを 目標は、ローカル・コレクションを維持する必要がなく、単に return となります。

public static List<DesktopComputer> BuildComputerAssets()
{           
    List<string> idTags = GetComputerIdTags();

    foreach (var pcTag in idTags)
    {
        yield return new DesktopComputer() {AssetTag= pcTag
                                          , Description = "PC " + pcTag
                                          , AcquireDate = DateTime.Now
                                           };
    }            
}

残念ながら、このコードでは例外が発生します。

エラー28 'System.Collections.Generic.List' はイテレータインターフェイス型ではないため、 'Foo.BuildComputerAssets()' のボディはイテレータブロックにはなりえません。

質問内容

  • このエラーメッセージは何を意味しているのですか?
  • どうすればこのエラーを回避して yield return を正しく使うことができますか?

解決方法は?

を使用することができます。 yield return を返す関数で IEnumerable または IEnumerator ではなく List<T> .

を返すように関数を変更する必要があります。 IEnumerable<DesktopComputer> .

あるいは、この関数を書き換えて、次のように使うこともできます。 List<T>.ConvertAll :

return GetComputerIdTags().ConvertAll(pcTag => 
    new DesktopComputer() {
        AssetTag    = pcTag,
        Description = "PC " + pcTag,
        AcquireDate = DateTime.Now
    });