2010-11-01 21 views
14

Como entiendo predeterminado (objeto) donde 'objeto' es cualquier tipo de referencia siempre devuelve nulo, pero ¿puedo especificar cuál es el valor predeterminado? Por ejemplo, quiero default (object) == new object();Especifique el valor predeterminado para un tipo de referencia

+1

No, no es posible. ¿Puede decirnos el objetivo final aquí, es decir, por qué querría esta función? – Ani

+0

No. ¿Y por qué tendrías que hacer eso? Si el objeto es nulo, ¡simplemente asigne uno nuevo! –

+1

Solo para poder decir FirstOrDefault() y nunca obtener un nulo. Supongo que solo escribiré un nuevo método de extensión. –

Respuesta

25

default(type) siempre devolverá la misma cosa - un "cero' ed out "versión de ese tipo. Para un tipo de referencia, este es un identificador para un objeto que siempre se establece con un valor de cero, que equivale a null. Para un tipo de valor, esta es siempre la estructura con todos los miembros configurados en cero.

No hay forma de anular este comportamiento: la especificación de idioma está diseñada de esta manera.


Editar: En cuanto a su comentario:

sólo para poder decir FirstOrDefault() y nunca obtener un valor nulo.

No lo recomendaría en ningún caso. Los usuarios esperan FirstOrDefault() para devolver null en caso de error. Sería mejor escribir su propio método de extensión:

static T FirstOrNewInstance<T>(this IEnumerable<T> sequence) where T : class, new() 
{ 
    return sequence.FirstOrDefault() ?? new T(); 
} 
3

Lo sentimos, no soy Jon Skeet ...

Pero de todos modos, la respuesta es "no se puede"

+6

Normalmente, Jon Skeet explica por qué (o por qué no en este caso) :) – PostMan

+0

@PostMan, como dije, no soy Jon Skeet;). De todos modos, no creo que haya algo que explicar aquí ... simplemente no es posible. –

+0

Solo hazlo, estarás bien :) Pero sí, estoy de acuerdo, no hay otra explicación que no puedas. (aparte de una decisión de diseño) – PostMan

Cuestiones relacionadas