2012-10-05 13 views
6

Sto ottenendo il seguente messaggio di errore quando si tenta di modificare 3.4 dal libro di Jon Skeet, C# in profondità ...Implementazione IComparable <T>

Il tipo 'list_3_4.Dog' non può essere utilizzato come parametro di tipo ' T 'nel tipo generico o nel metodo' list_3_4.Program.CompareToDefault (T) '. Non c'è alcuna conversione implicita del riferimento da 'list_3_4.Dog' a 'System.IComparable'.

Ecco il mio codice ...

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

Come si aggiunge un tipo di riferimento come un "cane" di lavorare con messa in vendita di codice Jon Skeets ??? Capisco che Dog abbia bisogno di implementare IComparable ma non so come!

+1

qual è la domanda? – elyashiv

+1

La classe 'Dog' non sembra implementare' IComparable ', come specificato dal vincolo generico' dove T: IComparable '. –

+1

+1 Per un esempio di codice che è possibile copiare, incollare e riprodurre con. Anche se una domanda sarebbe stata bella lol –

risposta

12

si definiscono i metodi dicendo è necessario un tipo di T che è un IComparable<T>:

where T: IComparable<T> 

Ma Dog non implementa IComparable<Dog>

Hai bisogno di fare:

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

Nota: default(T) restituirà null per i tipi di riferimento, quindi dovresti eseguire un controllo Null da qualche parte. Maggiori informazioni su default on msdn.

+2

@Demetrius L'implementazione finale che decidete dovrebbe eseguire il controllo nullo su '_name' e' altro' e 'other.Name'. –

+0

In realtà non è necessario la proprietà 'Name'. Se lo aggiungi, dovresti almeno rendere privato anche il setter. – Servy

+0

@AdamHouldsworth o si può semplicemente usare lo statico 'string.Compare' che esegue il controllo nulla per te. – Servy

8

La classe Dog deve implementare 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); 
     } 
} 
+0

classe pubblica Cane: IComparable non funziona, solo classe pubblica Cane: IComparable sta funzionando ... una specie di ... ora sto ricevendo una NullReferenceException ??? – dannyrosalex

+0

@DemetriusBerlioz Ho aggiunto un controllo per 'other == null', dovrebbe funzionare ora. – Alex

Problemi correlati