Saltar al contenido

¿Cómo puedo establecer un parámetro predeterminado en Guid.Empty en C#?

Siéntete libre de compartir nuestra web y códigos con tus amigos, apóyanos para aumentar esta comunidad.

Solución:

Solución

Puedes usar new Guid() en lugar de

public void Problem(Guid optional = new Guid())

  // when called without parameters this will be true
  var guidIsEmpty = optional == Guid.Empty;

También puedes usar default(Guid)

default(Guid) también funcionará exactamente como new Guid().

Debido a que Guid es un tipo de valor, no un tipo de referencia, entonces, default(Guid) no es igual a null por ejemplo, en cambio, es igual a llamar al constructor predeterminado.

Lo que significa que esto:

public void Problem(Guid optional = default(Guid))

  // when called without parameters this will be true
  var guidIsEmpty = optional == Guid.Empty;

Es exactamente igual que el ejemplo original.

Explicación

¿Por qué no Guid.Empty ¿trabajo?

La razón por la que está recibiendo el error es porque Empty Se define como:

public static readonly Guid Empty;

Entonces, es una variable, no una constante (definida como static readonly no como const). El compilador solo puede tener valores conocidos por el compilador como valores predeterminados de parámetros de método (no solo conocidos en tiempo de ejecución).

La causa principal es que no puedes tener un const de cualquier struct, a diferencia de enum por ejemplo. Si lo intentas, no compilará.

La razón una vez más es que struct no es un tipo primitivo.
Para obtener una lista de todos los tipos primitivos en .NET, consulte http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
(tenga en cuenta que enum generalmente hereda int, que es un primitivo)

Pero new Guid() no es una constante también!

No digo que necesite una constante. Necesita algo que se pueda decidir en tiempo de compilación. Empty es un campo, por lo que su valor no se conoce en tiempo de compilación (solo al comienzo del tiempo de ejecución).

El valor del parámetro predeterminado debe conocerse en tiempo de compilación, lo que puede ser un const valor, o algo definido usando una característica de C# que da a conocer el valor en tiempo de compilación, como default(Guid) o new Guid() (que se decide en tiempo de compilación para structs como no se puede modificar el struct constructor en código).

Si bien puede proporcionar default o new fácilmente, usted no puede proporcionar un const (porque no es un tipo primitivo o un enum como se explicó anteriormente). Entonces, nuevamente, no digo que el parámetro opcional en sí mismo necesite una constante, pero un valor conocido por el compilador.

Guid.Empty es equivalente a new Guid(), que es equivalente a default(Guid). Entonces puedes usar:

public void Problem(Guid optional = default(Guid))

o

public void Problem(Guid optional = new Guid())

Tenga en cuenta que el new Foo() el valor es solo aplicable cuando:

  • Realmente estás llamando a la sin parámetros constructor
  • Foo es un tipo de valor

En otras palabras, cuando el compilador sabe que en realidad es solo el valor predeterminado para el tipo 🙂

(Curiosamente, estoy 99.9% seguro de que no lo haré llamar a cualquier costumbre new Foo() constructor que puede haber creado. No puede crear un constructor de este tipo en un tipo de valor en C#, pero poder hacerlo en IL.)

Puedes usar el default(Foo) opción para ningún escribe.

¿No puedes usar:

default ( Guid ) ?

Aquí tienes las comentarios y puntuaciones

Recuerda compartir esta noticia si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *