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,是由于复制和粘贴错误(对不起家伙,今天太多的通用代码).
当然我的问题被误解了,因为我没有给你所需要回答的所有元素(我很快就会把它删除).我需要IType是IConvertible.无论如何,感谢所有人.
这是一个实例引用:
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.
最后我是这样解决的:
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)