0

我有这个事件类:

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 隐式转换为. 我认为这应该没问题,因为我为此方法添加了约束,但即使显式转换(使用带括号的经典转换或使用)我得到一个.AnEventIEnumerableIEnumerable<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;
}
4

1 回答 1

0

如果您更改ItemWrapper

sealed class ItemWrapper
{
    AnAbstractClass Item { get; set; }
    Metadata Metadata { get; set; }

    ItemWrapper(AnAbstractClass item, Metadata metadata) 
    {
        Item = item;
        Metadata = metadata;
    }
}

你失去了什么?

于 2013-07-15T09:57:03.083 回答