2012-10-05 21 views
6

estoy recibiendo el siguiente mensaje de error al intentar ajustar Listing 3.4 del libro de Jon Skeet, C# en profundidad ...Ejecución IComparable <T>

El tipo 'list_3_4.Dog' no se puede utilizar como parámetro de tipo ' T 'en el tipo genérico o método' list_3_4.Program.CompareToDefault (T) '. No hay conversión de referencia implícita de 'list_3_4.Dog' a 'System.IComparable'.

Aquí está mi código ...

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

¿Cómo agrego un tipo de referencia como un "perro" para trabajar con código de Jon Skeets lista ??? Entiendo que Dog necesita implementar IComparable, ¡pero no sé cómo!

+1

¿cuál es la pregunta? – elyashiv

+1

Su clase 'Dog' no parece aplicar' 'IComparable , según lo especificado por la restricción genérica' donde T: IComparable '. –

+1

+1 Para una muestra de código que podría copiar, pegar y jugar. Aunque una pregunta habría sido agradable lol –

Respuesta

12

se definen los métodos diciendo que necesita un tipo T que es un IComparable<T>:

where T: IComparable<T> 

Pero Dog no implementa IComparable<Dog>

Que tiene que hacer:

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) devolverá nulo para tipos de referencia, por lo que debe hacer una comprobación nula en alguna parte. Lea sobre default on msdn.

+2

@Demetrius La implementación final que decida debería hacer una comprobación nula en '_name' y' other' y 'other.Name'. –

+0

En realidad, no necesita la propiedad 'Nombre'. Si lo agrega, al menos también debe hacer que el colocador sea privado. – Servy

+0

@ AdamHouldsworth o puede usar el 'string.Compare' estático que hace la comprobación nula para usted. – Servy

8

Su clase debe implementar DogIComparable<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

clase pública Perro: IComparable no funciona, solo la clase pública Dog: IComparable está funcionando ... más o menos ... ¿ahora obtengo una NullReferenceException ??? – dannyrosalex

+0

@DemetriusBerlioz He agregado un cheque para 'other == null', debería funcionar ahora. – Alex

Cuestiones relacionadas