Solución
Puedes usar new Guid()
en su lugar
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, por lo tanto, default(Guid)
no es igual a, null
por ejemplo, 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 lo mismo que el ejemplo original.
Explicación
¿Por qué no Guid.Empty
funcionó?
La razón por la que obtiene 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 del compilador como valores predeterminados de los parámetros del método (no conocidos solo en tiempo de ejecución).
La causa raíz es que no puedes tener un const
ningunastruct
, a diferencia de, enum
por ejemplo. Si lo prueba, no se 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 queenum
generalmente heredaint
, que es un primitivo)
Pero new Guid()
tampoco es una constante!
No digo que necesite una constante. Necesita algo que se pueda decidir en tiempo de compilación.Empty
es un campo, por lo tanto, su valor no se conoce en tiempo de compilación (solo al comienzo del tiempo de ejecución).
El valor predeterminado del parámetro debe conocerse en tiempo de compilación, que puede ser un const
valor o algo definido mediante una función de C # que hace que el valor sea conocido en tiempo de compilación, como default(Guid)
o new Guid()
(que se decide en tiempo de compilación parastruct
s ya que no puede modificar el struct
constructor en código).
Si bien puede proporcionar default
o no new
, no puede proporcionar un const
(porque no es un tipo primitivo o enum
como se explicó anteriormente). Entonces, nuevamente, no digo que el parámetro opcional en sí mismo necesite un valor conocido constante, pero compilador.