2011-02-23 8 views
11

Me gustaría cambiar el comportamiento predeterminado (T) de ciertas clases. Entonces, en lugar de devolver nulo para mis tipos de referencia, me gustaría devolver un objeto nulo.¿Cómo cambiar lo que devuelve el valor predeterminado (T) en C#?

Algo así como

kids.Clear(); 
var kid = kids.Where(k => k.Age < 10).SingleOrDefault(); 

if (kid is NullKid) 
{ 
    Console.Out.WriteLine("Jippeie"); 
} 

Alguien sabe si esto es posible en absoluto?

Respuesta

2

Creo que ya tienes la respuesta en tu pregunta: if/switch statement. Algo como esto:

if (T is Dog) return new Dog(); 
    //instead of return default(T) which is null when Dog is a class 

Usted puede hacer su propio método de extensión de esta manera:

public static T SingleOrSpecified<T>(this IEnumerable<T> source, Func<T,bool> predicate, T specified) 
{ 
    //check parameters 
    var result = source.Where(predicate); 
    if (result.Count() == 0) return specified; 
    return result.Single(); //will throw exception if more than 1 item 
} 

Uso:

var p = allProducts.SingleOrSpeficied(p => p.Name = "foo", new Product()); 
+0

creo, queda la pregunta: ¿cómo puede alguien hacer esto desde el interior de ... SingleOrDefault()!? –

+1

@ralf: Em..I agrego una implementación de ejemplo. Ver mi edición –

3

No creo, es posible. Sin embargo, lo que podría hacer es crear su propio método de extensión SingleOrCustomDefault o algo así.

+1

Ese es definitivamente el enfoque más limpio. –

7

No puede cambiar el valor predeterminado (T): siempre es nulo para los tipos de referencia y cero para los tipos de valores.

3

¿Qué tal esto:

var kid = kids.Where(k => k.Age < 10).SingleOrDefault() ?? new Kid(); 
+1

+1 por simplicidad. – Lucas

+2

Equivalente más corto: 'var kid = kids.SingleOrDefault (k => k.Age <10) ?? nuevo Kid(); ' – smdrager

12

Alguien sabe si esto es posible en absoluto ?

Simplemente no es posible en absoluto.

Pero tal vez usted desea utilizar DefaultIfEmpty lugar:

kids.Clear(); 
var kid = kids.Where(k => k.Age < 10).DefaultIfEmpty(NullKid).Single(); 

if (kid == NullKid) 
{ 
    Console.Out.WriteLine("Jippeie"); 
} 
Cuestiones relacionadas