次のようなインターフェイスとクラスを使用しました。
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 つの変更のいずれかが行われた場合、コンパイラはエラーを出していました。
Wrapper
クラスは封印。- ライン 1 はライン 2 に置き換えられます
ライン1:
foreach ( IIdentity identity in identities )
2行目:
foreach ( var identity in identities )
問題は、変更 1 または 2 が適用されていない場合に、コンパイラがアプリケーションを正常にコンパイルしたのはなぜですか?