4

シリアル化/逆シリアル化クラスを実現する必要があり、を使用してSystem.Xml.Serializationいます。私はいくつかのタイププロパティを持っており、特定のカルチャ情報を持つリストに属するすべての10進値IList<Decimal>をデコードする際にシリアル化したいと考えていました。IList<string>たとえば、イタリアの文化情報が10ありますが、英語の文化情報があります。私はこれを使ってそれをやろうとしました:10,0010.00

public IList<string> method()
    {
        for (int i = 0; i < 1000; i++)
        {
            yield return i.ToString();
        }
    }   

しかし、コンパイル時にエラー33が発生します

The body of 'Class1.method()' cannot be an iterator block because 'System.Collections.Generic.IList<string>' is not an iterator interface type

プロパティタイプとして使用するとIEnumerable<string>正常に機能しますが、シリアル化するデータのタイプを変更できないことは明らかです。

どんな助けでも大歓迎です。

4

2 に答える 2

7

yieldIEnumerable<T>IEnumerableIEnumerator<T>およびIEnumerator戻り型としてのみ機能します。
あなたの場合、代わりに通常の方法を使用する必要があります。

public IList<string> method()
{
    var result = new List<string>();
    for (int i = 0; i < 1000; i++)
    {
        result.Add(i.ToString());
    }
    return result;
}

考えてみてください。あなたのコードでは、次のコードを書くことができます。

method().Add("foo");

それはあまり意味がありませんね。

于 2012-11-22T13:38:20.773 に答える
2

次のように、反復子ブロックをプライベート メソッドまたはゲッターに移動することもできます。

public IList<string> method()
{
  return seq.ToList();
}

IEnumerable<string> seq
{
  get
  {
    for (int i = 0; i < 1000; i++)
    {
      yield return i.ToString();
    }
  }
}

ただし、範囲の特定のケースについては、次のように使用できるx : x+1 : x+2 : ... : x+(n-1)メソッドが .NET に既に存在することにも注意してください。Enumerable.Range

public IList<string> method()
{
  return Enumerable.Range(0, 1000).Select(i => i.ToString()).ToList();
}
于 2012-12-01T10:56:06.593 に答える