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, nullpor 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.Emptyfuncionó?
La razón por la que obtiene el error es porque Emptyse define como:
public static readonly Guid Empty;
Entonces, es una variable, no una constante (definida como static readonlyno 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, enumpor ejemplo. Si lo prueba, no se compilará.
La razón una vez más es que structno 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.Emptyes 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 constvalor 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 structconstructor en código).
Si bien puede proporcionar defaulto no new, no puede proporcionar un const(porque no es un tipo primitivo o enumcomo se explicó anteriormente). Entonces, nuevamente, no digo que el parámetro opcional en sí mismo necesite un valor conocido constante, pero compilador.