Реализация IEnumerable : GetEnumerator не имеет соответствующего возвращаемого типа
Ошибка:»ConsoleApplication2.Group» не реализует член интерфейса «System.Collections.IEnumerable.GetEnumerator()». «ConsoleApplication2.Group.GetEnumerator()» не может реализовать «System.Collections.IEnumerable.GetEnumerator()», потому что не имеет соответствующего возвращаемого типа «System.Collections.IEnumerator».
Что я не так делаю?
Помощь в написании контрольных, курсовых и дипломных работ здесь.

Здесь дан пример. Рассмотрим его часть: public class People : IEnumerable < private Person.
Интерфейс IEnumerable наследуется от интерфейса IEnumerable, который тоже придется реализовать, чего у вас не сделано.
Реализация GetEnumerator()
Здравствуйте, форумчане, помогите пожалуйста с решением задачи. Имеется такой код: class.

Оператор foreach не работает с переменными типа «Лаба_2.RList» так как «Лаба_2.RList» не содержит.
Реализация IEnumerable
Хочу научиться использовать класс Queue на примере данной структуры: private struct.
Ограничения параметров типа (руководство по программированию на C#)
Зачем использовать ограничения
Ограничения определяют возможности и ожидания параметра типа. Объявление этих ограничений означает, что можно использовать операции и вызовы методов ограничивающего типа. Если универсальный класс или метод использует любые другие операции с универсальными элементами, помимо простого присвоения или вызова методов, которые не поддерживает System.Object, вам необходимо будет применить ограничения к параметру типа. Например, на основе ограничения базового класса компилятор определяет, что в качестве аргументов типа будут использоваться только объекты указанного типа или производных от него. Имея такую гарантию, компилятор может вызывать методы указанного типа в универсальном классе. В следующем примере кода показаны функциональные возможности, которые можно добавить в класс GenericList (см. раздел Введение в универсальные шаблоны), применив ограничение базового класса.
К одному параметру типа можно применять несколько ограничений, которые сами по себе могут быть универсальными типами, как показано ниже:
Компилятору известно только то, что T является ссылочным типом во время компиляции, и он должен использовать операторы по умолчанию, которые действительны для всех ссылочных типов. Чтобы проверить равенство значений, рекомендуется применить ограничение where T : IEquatable или where T : IComparable и реализовать этот интерфейс в любом классе, который будет использоваться для создания универсального класса.
Ограничение нескольких параметров
Ограничения можно применить к нескольким параметрам. Кроме того, к одному параметру можно применять несколько ограничений, как показано в следующем примере:
Несвязанные параметры типа
Не имеющие ограничений параметры типа (например, T в общем классе SampleClass <> ) называются несвязанными. В отношении несвязанных параметров типа применяются следующие правила:
Параметры типа в качестве ограничений
Использование параметров универсального типа в качестве ограничений применимо, когда функция-член со своим параметром типа должна ограничивать этот параметр параметром содержащего типа, как показано в следующем примере:
Параметры типа также можно использовать в определениях универсальных классов. Параметр типа необходимо объявлять в угловых скобках вместе с любыми другими параметрами типа:
Ограничение notnull
Ограничение notnull действует только при использовании в контексте, допускающем значения NULL. При добавлении ограничения notnull в очевидный контекст, допускающий значения NULL, компилятор не создает никаких предупреждений или ошибок в случае нарушений ограничения.
Ограничение class
Начиная с C# 8.0, ограничение class в контексте, допускающем значения NULL, указывает, что аргумент типа должен быть ссылочным типом, не допускающим значения NULL. Если в контексте, допускающем значения NULL, аргумент типа является ссылочным типом, допускающим значения NULL, компилятор выдаст предупреждение.
Ограничение default
Неуправляемое ограничение
Ограничения делегата
Кроме того, начиная с C# 7.3 можно использовать System.Delegate или System.MulticastDelegate как ограничение базового класса. В среде CLR это ограничение всегда было разрешено, но в языке C# оно было запрещено. Ограничение System.Delegate позволяет написать код, который работает с делегатами типобезопасным образом. Следующий код определяет метод расширения, который объединяет два делегата при условии, что они одного типа:
Приведенный выше метод можно использовать для объединения делегатов, которые относятся к одному типу:
Если раскомментировать последнюю строку, она не будет компилироваться. first и test являются типами делегатов, но это разные типы делегатов.
Ограничения перечисления
Enum.GetValues и Enum.GetName используют отражение, которое влияет на производительность. Вы можете не повторять вызовы, требующие отражения, а вызвать EnumNamedValues для создания коллекции, которая кэшируется и используется повторно.
Вы можете использовать его, как показано в следующем примере, для создания перечисления и словаря имен и значений:
Аргументы типа C# нельзя вывести из использования в Select с несколькими возвращениями
аргументы типа для метода ‘ System.В LINQ.Перечислимый.выбранная система.Коллекции.Родовой.IEnumerable, System.Функ)’ не может быть выведено из использования. Попробуйте явно указать аргументы типа.
2 ответов
это раздел 7.5.2.12 спецификации C# 4:
выводимый возвращаемый тип анонимной функции F используется во время вывода типа и разрешения перегрузки. Выводимый возвращаемый тип может быть определен только для анонимной функции, где известны все типы параметров, либо потому, что они явно заданы, предоставлены посредством анонимного преобразования функции, либо выводятся во время вывода типа на заключительном вызове универсального метода. Выведенный тип возвращаемого определяется следующим образом:
раздел 7.5.2.14 таков:
в некоторых случаях для набора выражений необходимо вывести общий тип. В частности, таким образом найдены типы элементов неявно типизированных массивов и возвращаемые типы анонимных функций с блочными телами.
интуитивно, учитывая набор выражений E1. Em, этот вывод должен быть эквивалентен вызову метода
С Ei в качестве аргументов.
точнее, вывод начинается с незафиксированного типа переменная X. вывод типа вывода затем производится из каждого Ei в X. наконец, X фиксируется, и в случае успеха результирующий тип S является лучшим общим типом для выражений. Если такой S не существует, выражения не имеют наилучшего общего типа.
Итак, предположим, мы имеем:
Я предполагаю, что где-то есть конкретное предложение спецификации C#, которое диктует это. (EDIT: Джон Скит нашел его и разместил их в своем ответе)
Лучшая ставка в в этом случае нужно просто привести каждый из ваших операторов return к типу A или сохраните его во временной переменной:
EDIT: если вы в порядке без выведенного типа, вы можете явно вызвать Select запрос:
тогда компилятор просто убедится, что ваши возвращаемые типы неявно совместимы с A (где они есть)
С#. Вопросы и ответы к собеседованию. Часть 4
Вопрос 15
В чем отличие необязательных параметров от именованных?
Ответ
Необязательные параметры должны быть использованы в том же порядке, в котором определены в методе. Именованные могут быть в другом порядке.
Вопрос 16
Чем отличаются друг от друга классы String и StringBuilder? Зачем нужно такое разделение?
Ответ
String создает новые объекты при добавлении новой строки. StringBuilder работает с одним объектом в памяти.
Строка иммьютабельна (её невозможно изменить после того, как она создана). Если вы что-то прибавляете к строке, то в действительности вы не получите старую строку + добавку, вы получите новую строку, составленную из старой и добавки. Отсюда все проблемы с производительностью в приложениях, которые последовательно формируют большие строки.
StringBuilder же будет последовательно выделять память и “по-настоящему” дозаписываться данными. Так что при построении больших строк – только StringBuilder.
Вопрос 17
Какие отличие между значимыми и ссылочными типами?
Ответ
Типы по значению размещаются в стеке потока. Типы по ссылке размещаются в управляемой куче.
Когда программа только запускается на выполнение, в конце блока памяти, зарезервированного для стека устанавливается указатель стека. При помещении данных в стек указатель переустанавливается таким образом, что снова указывает на новое свободное место. При вызове каждого отдельного метода в стеке будет выделяться область памяти или фрейм стека, где будут храниться значения его параметров и переменных.
Ссылочные типы хранятся в куче или хипе, которую можно представить как неупорядоченный набор разнородных объектов. Физически это остальная часть памяти, которая доступна процессу.
При создании объекта ссылочного типа в стеке помещается ссылка на адрес в куче (хипе). Когда объект ссылочного типа перестает использоваться, то ссылка из стека удаляется, и память очищается. После этого в дело вступает автоматический сборщик мусора: он видит, что на объект в хипе нету больше ссылок, и удаляет этот объект и очищает память.
Вопрос 18
Как и зачем использовать конструкцию Using в C#?
Ответ
Это аналог try finally. Мы говорим компилятору, что ресурсы можно очистить. По окончании блока вызывается метод Dispose. Класс, который использует using обязательно должен реализовывать интерфейс IDisposalbe.
Вопрос 19
В чем отличие использования Finalize и Dispose?
В моменте очистки мусора.
Dispose – обеспечивает явный контроль над ресурсами, используемыми объектом, а Finalize – неявный, используемый сборщиком мусора.
Finalize определен для типа object и соответственно его потомков. Физическое удаление из памяти происходит в момент сборки мусора, например в конце программы. Dispose это метод интерфейса IDisposable. Предполагается, что физическое удаление ресурсов произойдет в момент вызова Dispose.
Вопрос 20
В чем основные отличия класса от структуры в языке C#?
Класс это ссылочный тип. Все его данные содержатся в куче. Структура может содержать данные по значению и по ссылке. Данные структуры по значению содержатся в стеке, по ссылке в куче.
Вопрос 21
Как можно сравнить строки в C#?
Через метод Compare например.
Вопрос 22
Что такое управляемый код и CLR? Основные требования к управляемому коду.
Ответ
CLR заботится об управлении памятью, о совместимости между платформами, о безопасности кода и так далее Это хорошо описано у Рихтера.
Вопрос 23
Ответ
IQueryable наследуется от IEnumerable
IEnumerable находится в пространстве имен System.Collections
IQueryable располагается в пространстве имен System.Linq
Объект IEnumerable представляет набор данных в памяти и может перемещаться по этим данным только вперед. Запрос, представленный объектом IEnumerable, выполняется немедленно и полностью, поэтому получение данных приложением происходит быстро.
Объект IQueryable предоставляет удаленный доступ к базе данных и позволяет перемещаться по данным как в прямом порядке от начала до конца, так и в обратном порядке
Методы расширений LINQ могут возвращать два объекта: IEnumerable и IQueryable. С одной стороны, интерфейс IQueryable наследуется от IEnumerable, поэтому по идее объект IQueryable это и есть также объект IEnumerable. Но реальность несколько сложнее. Между объектами этих интерфейсов есть разница в плане функциональности, поэтому они не взаимозаменяемы.
При выполнении запроса IEnumerable загружает все данные, и если нам надо выполнить их фильтрацию, то сама фильтрация происходит на стороне клиента.
Вопрос 24
Что такое абстракция и как она связана с ООП?
Абстракция – это определенный уровень описания/представления модели чего либо.
ООП базируется на взаимодействии объектов которые описывают модель чего либо.
С помощью ООП можно создать абстракцию чего либо.
Абстракция необходима в крупных проектах.
С помощью нее можно обсуждать и работать на разных уровнях представления системы гораздо эффективнее не вдаваясь в детали всей системы.
Это как книга: название говорит о чем книга в целом, название разделов дает больше информации, но мы все равно не знаем что конкретно там написанно. Нахвание глав дает конкретнее посказку, но сама информация полная только внутри.
Представьте обсуждения книг без их названия, частей, глав.
Вопрос 25
Что такое IoC(Inversion of Control/инверсия зависимостей) и для чего она нужна?
Невозможно привести к базовому универсальному типу в C #, но можно использовать оператор as
Почему приведение типов не работает с ограниченным универсальным типом, как показано ниже?
B2 и B2 не является B1.
3 ответа
Дано
А что, если бы вы использовали свой класс вот так
Это то же самое, что и почему вы не можете сделать следующее
Короче говоря, вам, вероятно, придется переосмыслить свою проблему.
B1 не ограничивается назначением T. Например:
Тот факт, что T ограничен как B, не означает, что вы можете преобразовать любого потомка B к любому возможному T.
Почему бы в любом случае не допустить этого? На мой взгляд, в этом нет никакого смысла. Если вы хотите убедиться, что B1 назначается T, вам не следует использовать дженерики. Совершить такую ошибку слишком легко, и, если возможно, вам в первую очередь следует избегать использования дженериков. Они созданы (в первую очередь), чтобы сделать статическую типизацию более мощной, сохраняя при этом безопасность типов (и преимущества в производительности).
Однако есть определенно заведомо неправильные случаи, которые не попадают в ловушку, потому что
выполняет компиляцию, хотя на самом деле у него такая же проблема, и вы получите ошибку приведения во время выполнения, если T не B.
Конечно, в подобных случаях полезно проверить спецификация C #, и достаточно ясно, что в ней говорится:
Тот факт, что и T, и B1 являются производными от B, не означает, что B1 может быть назначен для T. Они оба могут быть назначены для B, поэтому
Как объяснялось выше, два класса с общим базовым классом не гарантируют совместимость типов, поэтому явное приведение типов тоже не сработает.
Он работает, но вы, вероятно, присваиваете значение b3 null, поскольку B1 не может быть преобразован в T. Оператор as просто возвращает значение null вместо выдачи предупреждения компилятора или исключения исключения.



