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 struct
s 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.