Respostas:
As outras respostas até agora estão todas corretas; Eu só queria adicionar mais um pouco mais limpo:
v2 = v1 ?? default(int);
Qualquer um Nullable<T>
é implicitamente conversível T
, desde que a expressão inteira que está sendo avaliada nunca possa resultar em uma atribuição nula a um ValueType. Portanto, o operador coalescente nulo ??
é apenas açúcar de sintaxe para o operador ternário:
v2 = v1 == null ? default(int) : v1;
... que por sua vez é açúcar de sintaxe para um if / else:
if(v1==null)
v2 = default(int);
else
v2 = v1;
Além disso, a partir do .NET 4.0, Nullable<T>
possui um método "GetValueOrDefault ()", que é um getter com segurança nula que basicamente executa a coalescência nula mostrada acima, portanto, isso também funciona:
v2 = v1.GetValueOrDefault();
default(int)
realmente necessário? O que há de errado com um simples 0
?
default
onde for apropriado. Zero nem sempre é válido como um valor, muito menos o padrão, portanto, se você substituirint
por um genérico, T
verá que meu código funciona enquanto zero não. Em alguma versão futura do framework, default
também pode se tornar sobrecarregável; se e quando isso acontecer, o código usando o padrão poderá tirar vantagem facilmente, enquanto as atribuições nulas ou zero explícitas precisarão ser alteradas.
Como isso,
if(v1.HasValue)
v2=v1.Value
Você pode usar a propriedade Value para atribuição.
v2 = v1.Value;
v1.HasValue
primeiro.
Se você sabe que v1
tem um valor, pode usar a Value
propriedade:
v2 = v1.Value;
O uso do GetValueOrDefault
método atribuirá o valor se houver um, caso contrário, o padrão para o tipo ou um valor padrão que você especificar:
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value
v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
Você pode usar a HasValue
propriedade para verificar se v1
tem um valor:
if (v1.HasValue) {
v2 = v1.Value;
}
Também há suporte ao idioma para o GetValueOrDefault(T)
método:
v2 = v1 ?? -1;
Você não pode fazer isso se a v1 for nula, mas você pode verificar com um operador.
v2 = v1 ?? 0;
GetValueOrDefault()
recupera o valor do objeto. Se for nulo, ele retornará o valor padrão de int, que é 0.
Exemplo:
v2= v1.GetValueOrDefault();
Se o valor padrão para um determinado tipo for um resultado aceitável:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();
Se você desejar um valor padrão diferente quando o resultado for indefinido:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
Se você deseja apenas o valor retornado (não importa se o método falhou ou não):
v2 = v1.GetValueOrDefault();
.NET 4.7.2 .: GetValueOrDefault()
retorna o valor do campo sem nenhuma verificação.
Para mim, a melhor solução é usar o GetValueOrDefault()
método
v2 = v1.GetValueOrDefault();
A conversão int anulável em int pode ser feita da seguinte maneira:
v2=(int)v1;
é possível com v2 = Convert.ToInt32(v1);
Você poderia fazer
v2 = v1.HasValue ? v1.Value : v2;
Uma conversão simples entre v1
e v2
não é possível porque v1
possui um domínio de valores maior que v2
. É tudo o que v1
pode aguentar mais o null
estado. Para converter, você precisa declarar explicitamente em que valor int
será usado para mapear o null
estado. A maneira mais simples de fazer isso é o ??
operador
v2 = v1 ?? 0; // maps null of v1 to 0
Isso também pode ser feito de forma longa
int v2;
if (v1.HasValue) {
v2 = v1.Value;
} else {
v2 = 0;
}
Dependendo do contexto de uso, você pode usar o recurso de correspondência de padrões do C # 7:
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
Como algumas pessoas estão votando sem deixar uma explicação, eu gostaria de adicionar alguns detalhes para explicar a lógica de incluir isso como uma solução viável.
A correspondência de padrões do C # 7 agora nos permite verificar o tipo de um valor e convertê-lo implicitamente. No snippet acima, a condição if somente passará quando o valor armazenado v1
for compatível com o tipo do tipo for v2
, que nesse caso é int
. Daqui resulta que, quando o valor for v1
for null
, a condição if falhará, pois null não pode ser atribuído a um int
. Mais corretamente, null
não é um int
.
Gostaria de destacar que o fato de que essa solução nem sempre é a melhor opção. Como sugiro, acredito que isso dependerá do contexto de uso exato do desenvolvedor. Se você já possui um int?
e deseja operar condicionalmente em seu valor se e somente se o valor atribuído não for nulo (este é o único momento em que é seguro converter um int nulo em um int regular sem perder informações), a correspondência de padrões é talvez uma das maneiras mais concisas de fazer isso.
HasValue
verificações.
No C # 7.1 e posterior, o tipo pode ser inferido usando o default
literal em vez do default
operador, para que possa ser escrito da seguinte maneira:
v2 = v1 ?? default;
int v2= Int32.Parse(v1.ToString());
v1
énull
?