« Impossible de convertir IComparer »
Question
Je le IComparer suivant défini pour les objets RegistryItem en boîte:
public class BoxedRegistryItemComparer : IComparer<object>
{
public int Compare(object left, object right)
{
RegistryItem leftReg = (RegistryItem)left;
RegistryItem rightReg = (RegistryItem)right;
return string.Compare(leftReg.Name, rightReg.Name);
}
}
Je veux l'utiliser pour trier un ArrayList de RegistryItems en boîte (Il devrait vraiment être un List<RegistryItem
>, mais c'est hors de mon contrôle).
ArrayList regItems = new ArrayList();
// fill up the list ...
BoxedRegistryItemComparer comparer = new BoxedRegistryItemComparer();
ArrayList.sort(comparer);
Cependant, la dernière ligne donne l'erreur du compilateur: « Impossible de convertir BoxedRegistryItemComparer à System.Collections.IComparer ». Je vous serais reconnaissant si quelqu'un pourrait me signaler mon erreur.
La solution
BoxedRegistryItemComparer
devrait mettre en œuvre System.Collections.IComparer
à utiliser avec ArrayList.Sort
. vous avez mis en System.Collections.Generic.IComparer<T>
qui n'est pas la même chose.
Autres conseils
Vous avez défini un Générique-Comparer (IComparer<T>
) au lieu d'un Comparer sans un type (IComparer
) . ArrayList.Sort()
un non attend générique IComparer
.
ne peuvent pas être génériques casted types dans leurs équivalents non génériques.
Si vous avez une situation où vous n'avez aucun contrôle sur le ou Sorter Comparer, voici deux mini-classes qui peuvent convertir entre les deux types (non testé):
private class GenericComparer<T> : IComparer<T>
{
IComparer _Comparer;
public GenericComparer(IComparer comparer)
{
_Comparer = comparer;
}
public int Compare(T a, T b)
{
return _Comparer.Compare(a, b);
}
}
private class NonGenericComparer<T> : IComparer
{
IComparer<T> _Comparer;
public NonGenericComparer(IComparer<T> comparer)
{
_Comparer = comparer;
}
public int Compare(object a, object b)
{
return _Comparer.Compare((T)a, (T)b);
}
}
Peut-être est une béquille, mais cela fonctionne:
arrayList.Sort(Comparer<object>.Create(
(x, y) => ((RegistryItem)x).Name.CompareTo(((RegistryItem)y).Name)));
Une alternative au poste ci-dessus serait d'avoir votre classe deux interfaces comparateur mettre en œuvre, vous pouvez lancer IComparer
public class MyComparer<T> : IComparer<T>, IComparer
public class BoxedRegistryItemComparer : IComparer {
...
}