【发布时间】:2012-05-23 09:59:45
【问题描述】:
我使用了类似于以下的接口和类:
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不到位的情况下编译器编译成功了?
【问题讨论】:
-
@Steven:这个问题绝对不是骗人的。
标签: c# .net generics compiler-construction foreach