无法从源转换为目标类型

时间:2012-07-31 21:13:15

标签: c# list icomparable custom-lists

我正在使用一个名为PriorityQueue的类,并且像名称一样说它应该比较元素并且命名它们这是优先级队列中的Comparer类

private class DefaultComparer : IComparer
        {
            #region IComparer Members

            public int Compare(object x, object y)
            {
                #region Require

                if(!(y is IComparable))
                {
                    throw new ArgumentException(
                        "Item does not implement IComparable.");
                }

                #endregion

                IComparable a = x as IComparable;

                Debug.Assert(a != null);

                return a.CompareTo(y);
            }

            #endregion
        }

这就是我的比较

class Coordenada : IComparable
    {
        public int x;
        public int y;
        public float heuristico;

        int IComparable.CompareTo(object coord1)
        {
            Coordenada c1 = (Coordenada)coord1;
            //Coordenada c2 = (Coordenada)coord2;

            if(c1.heuristico < heuristico)
                return 1;
            if(c1.heuristico > heuristico)
                return -1;

            return 0;
        }
    }

我在标题中说的错误是: 无法从源类型转换为目标类型我知道Coordenada和对象不一样所以这就是为什么我尝试了演员而且它不起作用 关于我该怎么做的任何想法?

编辑: 这就是我如何使用优先级队列来支持在Coordenada中使用CompareTo函数

    Coordenada c;
    PriorityQueue cola = new PriorityQueue();

    c.x = ax;
    c.y = ay;
    c.heuristico = distancia;
    cola.Enqueue(c)

priorityQueue是一个列表,我在一段时间内将2-3个不同的Coordenada对象添加到该列表中,因为我正在搜索每个周期中的最小数字并将其从我的列表中删除直到我到达我想要的位置

2 个答案:

答案 0 :(得分:1)

更改CompareTo方法。它接受object作为参数,因此它应该能够处理其他非Coordenada的事物。如果要与Coordenada进行比较的对象不是同一类型,则只返回适当的值(可能是-1,1,0,取决于您的逻辑)。你可以尝试这样:

int IComparable.CompareTo(object coord1)
{
    Coordenada c1 = coord1 as Coordenada;
    if (c1 == null)
        return -1;

    if(c1.heuristico < heuristico)
        return 1;
    if(c1.heuristico > heuristico)
        return -1;

    return 0;
}

如果你不比较性质完全不同的物体,那就更好了。

答案 1 :(得分:0)

如果您确定coord1Coordenada类型,请使用显式转换为

Coordenada c1 = coord1 as Coordenada;
如果InvaildCastExceptionc1,则

投掷null