我使用了类似于以下的接口和类:
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
接口。
但是,如果进行了以下两项修改之一,编译器会抱怨:
Wrapper
类是密封的。- 第 1 行替换为第 2 行
第 1 行:
foreach ( IIdentity identity in identities )
第 2 行:
foreach ( var identity in identities )
问题是为什么在修改 1 或 2 没有到位的情况下编译器成功编译了应用程序?