Alguém poderia explicar por que isso funciona no C # .NET 2.0:
Nullable<DateTime> foo;
if (true)
foo = null;
else
foo = new DateTime(0);
... mas isso não acontece:
Nullable<DateTime> foo;
foo = true ? null : new DateTime(0);
O último formulário gera um erro de compilação "O tipo de expressão condicional não pode ser determinado porque não há conversão implícita entre '<null>' 'e' System.DateTime '."
Não que eu não possa usar o primeiro, mas o segundo estilo é mais consistente com o restante do meu código.
c#
generics
nullable
conditional-operator
Nick Gotch
fonte
fonte
Respostas:
Esta pergunta já foi feita várias vezes. O compilador está lhe dizendo que não sabe como converter
null
emDateTime
.A solução é simples:
Observe que
Nullable<DateTime>
pode ser escrito, oDateTime?
que poupará bastante digitação.fonte
<null>
e, emDateTime
vez de encontrar o tipo de ancestral comum, apenas tenta encontrar uma conversão entre si. (Bit extra: C # reconhece um<null>
tipo, ou seja, o tipo de cadanull
expressão.)FYI (Offtopic, mas bacana e relacionado a tipos anuláveis), temos um operador útil apenas para tipos anuláveis chamado operador coalescente nulo
Usado assim:
fonte
Isso ocorre porque em um operador ternário, os dois valores devem ser resolvidos para o mesmo tipo.
fonte
Eu sei que essa pergunta foi feita em 2008 e agora é cinco anos depois, mas a resposta marcada como resposta não me satisfaz. A resposta real é que DateTime é uma estrutura e, como uma estrutura, não é compatível com nulo. Você tem duas maneiras de resolver isso:
O primeiro é tornar o nulo compatível com o DateTime (por exemplo, converter nulo para DateTime? Como sugere o cavalheiro com 70 votos positivos, ou converter nulo para Object ou ValueType).
O segundo é tornar o DateTime compatível com null (por exemplo, converter DateTime para DateTime?).
fonte
Outra solução semelhante à aceita é usar a
default
palavra-chave do C # . Embora definido usando genéricos, é realmente aplicável a qualquer tipo.Exemplo de uso aplicado à pergunta do OP:
Exemplo de uso com a resposta atual aceita:
Além disso, ao usar
default
, você não precisa especificar a variável comonullable
para atribuir umnull
valor a ela . O compilador atribuirá automaticamente o valor padrão do tipo de variável específico e nenhum erro será encontrado. Exemplo:fonte
default(DateTime)
não é nulo, é "1.1.0001 0:00:00
", o mesmo quenew DateTime(0)
.null
, só que usandodefault()
você pode atribuí-lo a umnullable
valor (como o MSDN declara). Os exemplos mostram que demonstram a versatilidade que pode ser utilizado comNullable<DateTime>
,DateTime?
e simplesmenteDateTime
. Se você acredita que isso está incorreto, você pode fornecer um PoC onde estes falham?null
na variável, nãodefault(DateTime)
, então isso é enganoso na melhor das hipóteses. Isso não é "versátil", como você sugere, já que a expressão como um todo ainda tem o mesmo tipo -DateTime
e você pode substituirdefault(DateTime)
pornew DateTime()
e fará a mesma coisa. Talvezdefault(DateTime?)
seja o que você quis dizer, já que isso é realmente igual anull
.