C#泛型类和EqualityComparer

Hei*_*bug 5 c# generics static icomparable icomparer

任何人都可以在下面的类声明中解释我的错误:

private class PriorityQueueEntry<TPriorityValue,IIdentifiableEntry,IType> :
        IComparer<PriorityQueueEntry<TPriorityValue,IIdentifiableEntry,IType>>
            where TPriorityValue : IComparable
            where IIdentifiableEntry : Identifier<IType>
    {
        public TPriorityValue Priority{get;private set;}
        public IIdentifiableEntry Entry{get;private set;}

        public PriorityQueueEntry(TPriorityValue val,IIdentifiableEntry entry)
        {
            Priority = val;
            Entry = entry;
        }
        public int Compare(PriorityQueueEntry<TPriorityValue,IIdentifiableEntry,IType> first, PriorityQueueEntry<TPriorityValue,IIdentifiableEntry,IType> second) 
        {
            if (first.Priority.CompareTo(second.Priority) < 0)
            {
                return -1;
            }
            else if (first.Priority.CompareTo(second.Priority) > 0)
            {
                return 1;
            }
            return EqualityComparer<IIdentifiableEntry>.Default.Equals( first.Entry.Id, second.Entry.Id);
        }
    }
Run Code Online (Sandbox Code Playgroud)

编译器在我使用EqualityComparer的行上抱怨.错误如下:

错误CS0176:无法使用实例引用访问静态成员`object.Equals(object,object)',而是使用类型名称限定它

我无法看到我在哪里使用实例引用.


对不起,我的错.我发布了一个不完整的问题 为了完整起见,Idetifier类只是以下内容:

public interface Identifier<ID_TYPE> 
{
    ID_TYPE Id{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

在那里使用EqualityComparer,是由于复制和粘贴错误(对不起家伙,今天太多的通用代码).

当然我的问题被误解了,因为我没有给你所需要回答的所有元素(我很快就会把它删除).我需要ITypeIConvertible.无论如何,感谢所有人.

Jon*_*eet 6

这是一个实例引用:

EqualityComparer<IIdentifiableEntry>.Default
Run Code Online (Sandbox Code Playgroud)

第一个问题是你根本不想打电话object.Equals(object, object).你真的想在相等比较器上调用方法 - 但是你试图用不可转换的参数调用它IIdentifieableEntry.

第二个问题是你正在尝试执行排序比较,而不是相等比较,所以你想要Comparer<T>而不是EqualityComparer<T>.

目前还不清楚你想要实现什么,但这段代码至少会编译:

return Comparer<IIdentifiableEntry>.Default.Compare(first.Entry, second.Entry);
Run Code Online (Sandbox Code Playgroud)

如果您真的想要比较Id属性,则需要ID属性类型的相等比较器- 我们不知道该类型是什么.

我怀疑你真的想要这样的事情:

return Comparer<string>.Default.Compare(first.Entry.Id, second.Entry.Id);
Run Code Online (Sandbox Code Playgroud)

......但这取决于的类型Id.

  • 此代码将无法编译,因为Equals返回bool并且该方法应返回int (6认同)

Hei*_*bug 1

最后我是这样解决的:

private class PriorityQueueEntry<TPriorityValue,IIdentifiableEntry,IType> :
        IComparer<PriorityQueueEntry<TPriorityValue,IIdentifiableEntry,IType>>
            where TPriorityValue : IComparable
            where IIdentifiableEntry : Identifier<IType>
            where IType : IConvertible
    {
        public TPriorityValue Priority{get;private set;}
        public IIdentifiableEntry Entry{get;private set;}

        public PriorityQueueEntry(TPriorityValue val,IIdentifiableEntry entry)
        {
            Priority = val;
            Entry = entry;
        }
        public int Compare(PriorityQueueEntry<TPriorityValue,IIdentifiableEntry,IType> first, PriorityQueueEntry<TPriorityValue,IIdentifiableEntry,IType> second) 
        {
            if (first.Priority.CompareTo(second.Priority) < 0)
            {
                return -1;
            }
            else if (first.Priority.CompareTo(second.Priority) > 0)
            {
                return 1;
            }
            return first.Entry.Id.ToUInt32(NumberFormatInfo.CurrentInfo) < first.Entry.Id.ToUInt32(NumberFormatInfo.CurrentInfo) ? -1:1; 
        }
    }
Run Code Online (Sandbox Code Playgroud)