Прочитать на английском

Поделиться через


Ошибка компилятора CS1579

Оператор foreach не работает с переменными типа "тип1", так как "тип2" не содержит открытого определения для "идентификатор"

Чтобы иметь возможность выполнить итерацию коллекции с помощью оператора foreach, коллекция должна соответствовать следующим требованиям:

  • Его тип должен включать открытый метод GetEnumerator без параметров со следующим типом возвращаемого значения: класс, структура или тип интерфейса.
  • Тип возвращаемого значения метода GetEnumerator должен содержать открытое свойство Current и открытый метод MoveNext без параметров с типом возвращаемого значения Boolean.

Пример

Следующий пример приводит к ошибке CS1579, так как класс MyCollection не содержит открытый метод GetEnumerator:

// CS1579.cs  
using System;  
public class MyCollection
{  
   int[] items;  
   public MyCollection()
   {  
      items = new int[5] {12, 44, 33, 2, 50};  
   }  
  
   // Delete the following line to resolve.  
   MyEnumerator GetEnumerator()  
  
   // Uncomment the following line to resolve:  
   // public MyEnumerator GetEnumerator()
   {  
      return new MyEnumerator(this);  
   }  
  
   // Declare the enumerator class:  
   public class MyEnumerator
   {  
      int nIndex;  
      MyCollection collection;  
      public MyEnumerator(MyCollection coll)
      {  
         collection = coll;  
         nIndex = -1;  
      }  
  
      public bool MoveNext()
      {  
         nIndex++;  
         return (nIndex < collection.items.Length);  
      }  
  
      public int Current => collection.items[nIndex];
   }  
  
   public static void Main()
   {  
      MyCollection col = new MyCollection();  
      Console.WriteLine("Values in the collection are:");  
      foreach (int i in col)   // CS1579  
      {  
         Console.WriteLine(i);  
      }  
   }  
}