将IList <t>转换为IList时出现InvalidCastException

时间:2017-06-10 08:59:10

标签: c# list linq

我正在尝试使用以下代码为IList<T>实现Sort方法:

public static void Sort<T>(this IList<T> list, Comparison<T> comparison)
{
    ArrayList.Adapter((IList)list).Sort(Comparer<T>.Create(comparison));
}

我正在调用已知类型元素列表的方法,并提供此比较功能:

cardwraplayout.Children.Sort((x, y) =>
{
    Card card1 = Cards.FindCardByIconId(x.Id);
    Card card2 = Cards.FindCardByIconId(x.Id);
    int result = card1.Rarity.CompareTo(card2.Rarity);
    if (result == 0)
    {
        result = card1.Name.CompareTo(card2.Name);
    }
    return result;
});

当我调用上述方法时,此行发生InvalidCastExceptionArrayList.Adapter((IList)list).Sort(Comparer<T>.Create(comparison));

  

System.InvalidCastException:指定的强制转换无效。

为什么我不能将IList<T>投射到IList以实现我自己的排序功能?

更新1: 尝试将Comparer<T>更改为Comparer<object>,仍会引发相同的异常。

public static void Sort<T>(this IList<T> list, Comparison<object> comparison)
{
    ArrayList.Adapter((IList)list).Sort(Comparer<object>.Create(comparison));
}

Image img1;
Image img2;

cardwraplayout.Children.Sort((x,y) =>
{
    img1 = (Image)x;
    img2 = (Image)y;
    Card card1 = Cards.FindCardByIconId(img1.Id);
    Card card2 = Cards.FindCardByIconId(img2.Id);
    int result = card1.Rarity.CompareTo(card2.Rarity);
    if (result == 0)
    {
        result = card1.Name.CompareTo(card2.Name);
    }
    return result;
});

更新2: 创建一个Comparer类是行不通的,因为我需要从另一个类访问几个字段,这会给我以下错误:

  

非静态字段,方法或的对象引用是必需的   财产“卡”

1 个答案:

答案 0 :(得分:2)

  

为什么我不能将IList<T>投射到IList以实现我自己的排序功能?

这取决于您收到的列表的具体类型。 IList<T>未实施IList。具体类可以选择实现IList<T>IList,仅实现IList<T>,仅实现IList,或者不实现IList<T>。两者之间没有固有的关系只因为他们有共同的名字。

例如:

通过转换为IList,你告诉编译器&#34;没关系,我比你知道的更多,我知道我已经真正实现的课程IList&#34。但是在这种情况下,班级没有实现IList<T>。因此失败了。

要对IList<T>进行排序,请创建适用于IList的内容,不要试图获取为T[]生效的内容。例如,您可以将所有内容复制到Array.Sort,调用ArrayList.Adapter(...).Sort(...),然后复制结果。 (实际上,这比add_filter( 'woocommerce_add_cart_item_data', 'limit_cart_to_one_item' ); function limit_cart_to_one_item( $cart_items ) { WC()->cart->empty_cart(); return $cart_items; } 所做的更有效。)或者您可以手动编码其中一种标准搜索算法。