我有这个事件类:
sealed class AnEvent : EventArgs
{
IEnumerable<ItemWrapper<AnAbstractClass>> Items { get; set; }
}
这是这样使用的:
class ItemsProcessor
{
delegate void OnItemsProcessedHandler(object sender, AnEvent e);
event OnItemsProcessedHandler OnItemsProcessed;
//...
}
我使用这个包装类:
sealed class ItemWrapper<T>
where T: AnAbstractClass
{
T Item { get; set; }
Metadata Metadata { get; set; }
ItemWrapper(T item, Metadata metadata)
{
Item = item;
Metadata = metadata;
}
}
我在ItemsProcessor
课堂上有这个方法:
internal void DoSomethingWithList<T>(IEnumerable<T> items)
where T: AnAbstractClass, new()
{
IEnumerable<ItemWrapper<T>> processedItems = WrapItems<T>(items);
OnItemsProcessed(this, new AnEvent() { Items = processedItems }); //error here
}
问题出在此代码示例的最后一行;当我尝试使用我的本地设置属性Items
时。编译器拒绝继续告诉我它不能将 an 隐式转换为. 我认为这应该没问题,因为我为此方法添加了约束,但即使显式转换(使用带括号的经典转换或使用)我得到一个.AnEvent
IEnumerable
IEnumerable<ItemWrapper<T>>
IEnumerable<ItemWrapper<AnAbstractClass>>
where T: AnAbstractClass, new()
Convert<>
InvalidCastException
我目前对该方法的解决方法DoSomethingWithList
是:
var temp = processedItems.Select(x =>
{
return new ItemWrapper<AnAbstractClass>(x.Item, x.Metadata);
});
OnItemsProcessed(this, new AnEvent() { Items = temp });
所以它现在工作正常,但我想知道为什么不使用这个LINQ
必须迭代列表中所有项目的转换就不能工作?对我来说很明显,你应该能够毫无错误地强制转换它,因为我添加了约束,即使使用显式强制转换使编译器接受我的代码,也会引发异常......任何人都可以指出我出了什么问题这里?
abstract class AnAbstractClass
{
}
class ItemClass : AnAbstractClass
{
}
如果WrapItems
您想尝试,可以快速实现轻松复制粘贴:
IEnumerable<ItemWrapper<T>> WrapItems<T>(IEnumerable<T> items)
where T : AnAbstractClass, new()
{
List<ItemWrapper<T>> ret = new List<ItemWrapper<T>>();
foreach (var item in items)
{
ret.Add(new ItemWrapper<T>(item, new Metadata()));
}
return ret;
}