6

Jon Skeet の本 C# in depth からリスト 3.4 を微調整しようとすると、次のようなエラー メッセージが表示されます。

型 'list_3_4.Dog' は、ジェネリック型またはメソッド 'list_3_4.Program.CompareToDefault(T)' の型パラメーター 'T' として使用できません。「list_3_4.Dog」から「System.IComparable」への暗黙的な参照変換はありません。

これが私のコードです...

using System;

namespace list_3_4
{
     class Program
     {
          static void Main(string[] args)
          {
               //string mystring;
               Dog d = new Dog("howie");

               Console.WriteLine(CompareToDefault("x"));
               Console.WriteLine(CompareToDefault(10));
               Console.WriteLine(CompareToDefault(0));
               Console.WriteLine(CompareToDefault(-10));              
               Console.WriteLine(CompareToDefault(DateTime.MinValue));

               Console.WriteLine(CompareToDefault(d));

               Console.ReadKey();
          }

          static int CompareToDefault<T> (T value) where T: IComparable<T>
          {
               return value.CompareTo(default(T));               
          }

     }

     public class Dog 
     {
          private string _name;

          public Dog(string name)
          {
               _name = name;
          }
         }
}

「犬」のような参照型を追加して、Jon Skeets のコード リストを操作するにはどうすればよいですか? Dog が IComparable を実装する必要があることは理解していますが、その方法がわかりません!

4

2 に答える 2

12

T次のタイプが必要だと言って、メソッドを定義しますIComparable<T>

where T: IComparable<T>

しかしDog実装しないIComparable<Dog>

あなたがする必要があります:

public class Dog : IComparable<Dog>
{
 //this will allow you to do a quick name comparison
 public string Name { get; set;}
 public int CompareTo(Dog other)
 {//compare dogs by name
        return this._name.CompareTo(other.Name);
 }
}

:は参照型に対してnulldefault(T)を返すため、どこかで null チェックを行う必要があります。msdn のデフォルトについて読んでください。

于 2012-10-05T14:19:01.860 に答える
10

クラスDogは を実装する必要がありますIComparable<T>

 public class Dog: IComparable<Dog>
 {
      private string _name;

      public Dog(string name)
      {
           _name = name;
      }

      public int CompareTo( Dog other )
      {
           if (other == null)
               return 1;
           return string.Compare( _name, other._name );
      }
 }
于 2012-10-05T14:20:20.800 に答える