2012-11-13 32 views
5

谁能给我解释一下什么是错在下面的类声明。该错误是以下内容:C#泛型类和EqualityComparer

错误CS0176:静态成员`的Object.Equals(对象,对象)”不能 与实例引用访问,具有类型名 代替

限定它我无法看到我在使用实例引用的位置。


对不起,我的错。我发了一个不完整的问题。 只是为了保持完整性,Idetifier类只是以下几点:使用EqualityComparer出现,是由于复制和粘贴错误(对不起你们,太多的通用代码今天)

public interface Identifier<ID_TYPE> 
{ 
    ID_TYPE Id{get;set;} 
} 

当然我的问题是错误的,因为我没有给你所有你需要回答的元素(我会尽快删除它)。我需要ITypeIConvertible。 感谢所有反正。

回答

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; 
     } 
    } 
6

这是一个实例参考:

EqualityComparer<IIdentifiableEntry>.Default 

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

的第二个问题是,你要执行排序比较,而不是一个平等比较,所以你要Comparer<T>,不EqualityComparer<T>

目前尚不清楚你想要达到什么样的,但是这个代码将至少编译

return Comparer<IIdentifiableEntry>.Default.Compare(first.Entry, second.Entry); 

如果你真的要比较的Id属性,需要一个相等比较为ID属性类型 - 我们不知道这是什么类型。

我怀疑它更可能是你真正想要的东西这样的:

return Comparer<string>.Default.Compare(first.Entry.Id, second.Entry.Id); 

...但它取决于Id类型。

+6

此代码不能编译,因为Equals返回一个布尔和方法应该返回一个int –

+0

@WouterdeKort:伊克。谢谢,会编辑。 –

+0

其实IType:IConvertible解决了我的问题。对不完整的问题抱歉。 – Heisenbug

3

您还没有显示标识符和EqualityComparer的声明。但我认为你需要行更改为类似:

return EqualityComparer<IIdentifiableEntry>.Default.Equals<IType>(first.Entry.Id, second.Entry.Id); 

[编辑]

按Jon的评论。你根本不想要相等比较器。 Asumming这是Entry.Id是IComparable的,然后只是:

return first.Entry.Id.CompareTo(second.Entry.Id); 

我会建议进入仅限于IComparable的,所以我们得到的东西,如:

类PriorityQueueEntry> 其中TPriorityValue:IComparable的 其中TEntry :IComparable的 { 公共TPriorityValue优先{获取;私人集;} 公共TEntry项{获取;私人集;}

public PriorityQueueEntry(TPriorityValue val, TIdentifiableEntry entry) 
    { 
     Priority = val; 
     Entry = entry; 
    } 
    public int Compare(PriorityQueueEntry<TPriorityValue, TEntry first, PriorityQueueEntry<TPriorityValue, TEntry> second) 
    { 
     if (first.Priority.CompareTo(second.Priority) < 0) 
     { 
      return -1; 
     } 
     else if (first.Priority.CompareTo(second.Priority) > 0) 
     { 
      return 1; 
     } 
     return first.Enrtry.CompareTo(second.Entry); 
    } 
} 

如果TEntry是一个类,您可能需要添加一些空检查。

+1

'EqualityComparer '是一个框架类。 –

+0

'Equals'在'EqualityComarer ' – 2kay

+0

中没有模板化方法我的不好。我google了它,它只返回IEqualityComparer。嗯。请忽略以前的答案。我会编辑一个新的答案。 –