Solução
Você pode usar new Guid()
em vez
public void Problem(Guid optional = new Guid())
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Você também pode usar default(Guid)
default(Guid)
também funcionará exatamente como new Guid()
.
Como Guid é um tipo de valor, não um tipo de referência, portanto, default(Guid)
não é igual a, null
por exemplo, em vez disso, é igual a chamar o construtor padrão.
O que significa que isso:
public void Problem(Guid optional = default(Guid))
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
É exatamente o mesmo que o exemplo original.
Explicação
Por que não Guid.Empty
funcionou?
O motivo pelo qual você está recebendo o erro é porque Empty
é definido como:
public static readonly Guid Empty;
Portanto, é uma variável, não uma constante (definida como static readonly
não como const
). O compilador pode ter apenas valores conhecidos do compilador como valores padrão dos parâmetros do método (não somente conhecidos em tempo de execução).
A causa raiz é que você não pode ter const
nenhum struct
, ao contrário enum
do exemplo. Se você tentar, ele não será compilado.
A razão mais uma vez é que struct
não é um tipo primitivo.
Para obter uma lista de todos os tipos primitivos no .NET, consulte http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
(observe que enum
geralmente herda int
, que é uma primitiva)
Mas new Guid()
também não é uma constante!
Não estou dizendo que precisa de uma constante. Precisa de algo que possa ser decidido em tempo de compilação. Empty
é um campo, portanto, seu valor não é conhecido no tempo de compilação (apenas no início do tempo de execução).
O valor padrão do parâmetro deve ser conhecido em tempo de compilação, que pode ser um const
valor, ou algo definido usando um recurso C # que torna o valor conhecido em tempo de compilação, como default(Guid)
or new Guid()
(que é decidido em tempo de compilação por struct
s, pois você não pode modificar o struct
construtor em código).
Embora você possa fornecer default
ou new
facilmente, você não pode fornecer um const
(porque não é um tipo primitivo ou enum
como explicado acima). Portanto, novamente, sem dizer que o parâmetro opcional em si precisa de um valor constante, mas conhecido do compilador.