Не делай этого.
A List<Field>
не является List<IField>
. Вы можете попытаться заставить компилятор принять его (я думал, что это невозможно, хотелось бы, чтобы это было невозможно), но это может привести к неприятностям. Компилятор позволит пользователю вводить AnotherField, производный от IField, в заданный список, нарушая ваши инварианты и нарушая безопасность типов, которую предоставляют дженерики. Дальнейшее использование List<Field>
прекратится, поскольку извлечение странного элемента завершится неявным приведением к полю, где вы не ожидаете, что это произойдет.
Если вам нужно вернуть List<IField>
вместо List<Field>
, то я рекомендую создать новый список, заполненный теми же элементами. Если вы можете изменить свой интерфейс, воспользуйтесь решением Jon Skeets .