2

次のようなインターフェイスとクラスを使用しました。

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

public class Identity : IIdentity
{
    public int Id { get; set; }
}

クラスのインスタンスを作成し、それを(後でインスタンス作成ブロックと呼びます) にIdentity追加していました。List<Identity>

var identities = new List<IIdentity>();
identities.Add( new Identity { Id = 1 } );
identities.Add( new Identity { Id = 2 } );
identities.Add( new Identity { Id = 3 } );

を次のように使用identitiesします。

foreach ( IIdentity identity in identities )
{
    Console.WriteLine( "Plug-in: {0}", identity.Id.ToString() );
}

IIdentity最近、 とを変更せずに、インスタンスに関するデータを追加する必要がIIdentityありIdentityました。したがって、次のクラスを追加しました。

public class Wrapper<T> where T : class
{
    public T WrappedObject { get; set; }
    public string Name { get; set; }
    public int Order { get; set; }
}

インスタンス作成ブロックを次のように置き換えました。

var identities = new List<Wrapper<IIdentity>>();
identities.Add( new Wrapper<IIdentity> { WrappedObject = new Identity { Id = 1 }, Name = "John", Order = 1 } );
identities.Add( new Wrapper<IIdentity> { WrappedObject = new Identity { Id = 2 }, Name = "Jane", Order = 2 } );
identities.Add( new Wrapper<IIdentity> { WrappedObject = new Identity { Id = 3 }, Name = "Joe", Order = 3 } );

アプリケーションをコンパイルするには、foreach ブロックに何らかの変更を加える必要があると予想していました。ただし、アプリケーションは正常にコンパイルされ、System.InvalidCastException実行時にスローされました。

提供されたコードから見えるため、インターフェイスWrapperを実装しません。IIdentity

ただし、次の 2 つの変更のいずれかが行われた場合、コンパイラはエラーを出していました。

  1. Wrapperクラスは封印。
  2. ライン 1 はライン 2 に置き換えられます

ライン1:

foreach ( IIdentity identity in identities )

2行目:

foreach ( var identity in identities )

問題は、変更 1 または 2 が適用されていない場合に、コンパイラがアプリケーションを正常にコンパイルしたのはなぜですか?

4

1 に答える 1