La siguiente no se compila:

public void MyMethod<T>(T value)
{
    if (value == default(T))
    {
        //do stuff
    }
}

De Error: Operator '==' cannot be applied to operands of type 'T' and 'T'

No los puedo usar value == null porque T puede ser un struct.

No se pueden utilizar las value.Equals(default(T)) porque value puede ser null.

¿Cuál es la manera adecuada para la prueba de igualdad en el valor predeterminado?

  • respondió un comentario; y para info, EqualityComparer<T> es la implementación estándar utilizado por la BCL, por ejemplo, en Dictionary<,>.
  • posibles duplicados de stackoverflow.com/questions/65351/…
InformationsquelleAutor Greg | 2009-12-13

2 Comentarios

  1. 77

    Para evitar boxeo para struct /Nullable<T>, me gustaría utilizar:

    if (EqualityComparer<T>.Default.Equals(value,default(T)))
    {
        //do stuff
    }

    Este es compatible con cualquier T que implementar IEquatable<T>, utilizando object.Equals como una copia de seguridad, y se encarga de null etc (y levantó los operadores para Nullable<T>) automáticamente.

    También hay Comparer<T>.Default que se encarga de las pruebas de comparación. Este maneja T que implementar IComparable<T>, volver a caer en IComparable – de nuevo el manejo de null y levantó los operadores.

    • Estás diciendo que EqualityComparer<T>.Default.Equals tiene mejor rendimiento que Object.Equals, o que daría un valor correcto, en algunos casos, que Object.Equals ¿no?
    • Mejor rendimiento (menos de boxeo); considerar la posibilidad de T=int; llamar object.Equals tiene a cuadro value y default(T) dos extra montón asignaciones + GC. El uso de EqualityComparer<T> tiene 3 diferentes implementaciones subyacentes – class, Nullable<T> y struct – se puede hacer todo (incluyendo null pruebas) sin cualquier de boxeo. El trabajo de averiguar que aplicación utilizar sólo se hace una vez por cada tipo y caché, por lo que sigue siendo muy rápido.
    • Gracias, Marc! Su explicación es maravilloso
    • Me parece que no puede conseguir que esto funcione. He creado una función con este dentro de probar y determinar si la estructura es todavía el valor predeterminado. Parece que siempre regreso FALSE (no valor predeterminado). Hice algo mal? Ref: stackoverflow.com/questions/35897019/…
  2. 28

    Lo que acerca de

    object.Equals(value, default(T))
    • Sabía que debería ser simple. Gracias.
    • +1. Probado. Funciona correctamente con diversos tipos: MyMethod(0); MyMethod<String>(null); MyMethod<DataSet>(null); – en cada caso, devuelve true.

Dejar respuesta

Please enter your comment!
Please enter your name here