Проблема с компилятором foreach и дженериковC#

Место общения программистов C#
Ответить
Anonymous
 Проблема с компилятором foreach и дженериков

Сообщение Anonymous »

Я использовал интерфейс и класс, похожие на следующие:

Код: Выделить всё

public interface IIdentity
{
int Id { get; set; }
}

public class Identity : IIdentity
{
public int Id { get; set; }
}
Я создавал экземпляры класса Identity и добавлял его в List (позже называемый блоком создания экземпляров).< /p>

Код: Выделить всё

var identities = new List();
identities.Add( new Identity { Id = 1 } );
identities.Add( new Identity { Id = 2 } );
identities.Add( new Identity { Id = 3 } );
а затем используя идентификаторы следующим образом:

Код: Выделить всё

foreach ( IIdentity identity in identities )
{
Console.WriteLine( "Plug-in: {0}", identity.Id.ToString() );
}
Недавно мне нужно было добавить больше данных об экземплярах IIdentity, не внося никаких изменений в IIdentity и Identity. Поэтому я добавил следующий класс:

Код: Выделить всё

public class Wrapper where T : class
{
public T WrappedObject { get; set; }
public string Name { get; set; }
public int Order { get; set; }
}
и заменил блок создания экземпляров следующим:

Код: Выделить всё

var identities = new List();
identities.Add( new Wrapper { WrappedObject = new Identity { Id = 1 }, Name = "John", Order = 1 } );
identities.Add( new Wrapper { WrappedObject = new Identity { Id = 2 }, Name = "Jane", Order = 2 } );
identities.Add( new Wrapper { WrappedObject = new Identity { Id = 3 }, Name = "Joe", Order = 3 } );
Я ожидал, что мне все равно придется внести некоторые изменения в блок foreach, чтобы приложение скомпилировалось. Однако приложение успешно скомпилировалось и при запуске выдало System.InvalidCastException.

Как видно из предоставленного кода, Wrapper не реализует IIidentity интерфейс.

Однако компилятор жаловался, если была сделана одна из двух модификаций:
  • Код: Выделить всё

    WrapperКласс 
    запечатан.
  • Строка 1 заменяется строкой 2.
Строка 1:

Код: Выделить всё

foreach ( IIdentity identity in identities )
Строка 2:

Код: Выделить всё

foreach ( var identity in identities )
Вопрос: почему компилятор успешно скомпилировал приложение, когда модификация 1 или 2 отсутствует?

Подробнее здесь: https://stackoverflow.com/questions/107 ... iler-issue
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»