2012-11-13 5 views
5

誰もが次のクラス宣言で間違っているものを私に説明してもらえます。型名 代わりC#ジェネリッククラスとEqualityComparer

とそれを修飾し、静的メンバー `はObject.equals(オブジェクト、オブジェクト)」 がインスタンス参照してアクセスすることができない。

エラーCS0176:エラーは、以下でありますインスタンス参照をどこで使用しているのかわかりません。


申し訳ありませんが、私のせいです。私は不完全な質問を投稿しました。

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

、コピー&ペーストのミスによるものであったが(申し訳ありませんみんな、あまり汎用コードを今日)EqualityComparerを使用して:ちょうど完全性について は、Idetifierクラスは、次のだけです。

もちろん私の質問はあなたに答えが必要なすべての要素を与えてくれなかったので(私はすぐにそれを削除します)、誤っていました。 私はがIConvertibleであることが必要でした。とにかくおかげさまで 。

答えて

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)を呼び出すにしたくないということです。あなたは本当にequality comparerのメソッドを呼びたいと思っていますが、IIdentifieableEntryに変換できない引数で呼び出そうとしています。

第二の問題はEqualityComparer<T>、ないあなたが比較、ない平等比較を注文を実行しようとしているので、あなたはComparer<T>をしたいということです。

あなたが達成しようとしているものをクリアしていないが、このコードは、少なくともコンパイルします:あなたが本当にIDプロパティを比較したい場合は、あなたが等値比較が必要

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

IDプロパティタイプ - そのタイプはわかりません。

私はそれはあなたが本当にこのような何かたいことがより可能性があります容疑者:

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

を...しかし、それはIdの種類によって異なります。

+6

イコールブール値を返し、メソッドがint –

+0

@WouterdeKort返す必要がありますので、このコードはコンパイルされません:嫌に。ありがとう、編集されます。 –

+0

実際にIType:IConvertibleが私の問題を解決しました。不完全な質問を申し訳ありません。 – Heisenbug

3

IdentifierまたはEqualityComparerの宣言が表示されていません。しかし、私はあなたのような何かに行を変更する必要があると仮定します。

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

[EDIT] Jonのコメントを1として

。あなたは平等比較者を全く望んでいません。そのEntry.IdがそしてちょうどIComparableを、であることをAsumming:私はそのエントリをお勧めします

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

でテンプレート化されていません。私はそれをgoogledとそれはIEqualityComparerを返しただけです。うーん。以前の回答は無視してください。私は新しい答えを編集します。 –

関連する問題