Problema de tipo anulável com?: Operador condicional

Alguém poderia explicar por que isso funciona em c # .net 2.0:

Nullable foo; if (true) foo = null; else foo = new DateTime(0); 

… mas isso não acontece:

  Nullable foo; foo = true ? null : new DateTime(0); 

A última forma me dá um erro de compilation “O tipo de expressão condicional não pode ser determinado porque não há conversão implícita entre ” e ‘System.DateTime’.”

Não que eu não possa usar o primeiro, mas o segundo estilo é mais consistente com o resto do meu código.

Esta pergunta já foi feita várias vezes. O compilador está dizendo que ele não sabe como converter null em um DateTime .

A solução é simples:

 DateTime? foo; foo = true ? (DateTime?)null : new DateTime(0); 

Observe que Nullable pode ser escrito como DateTime? o que vai poupar um monte de digitação.

FYI (Offtopic, mas bacana e relacionado a tipos anuláveis), temos um operador prático apenas para tipos anuláveis, chamado de operador de coalescência nulo

 ?? 

Usado assim:

 // Left hand is the nullable type, righthand is default if the type is null. Nullable foo; DateTime value = foo ?? new DateTime(0); 

É porque, em um operador ternário, os dois valores devem ser resolvidos para o mesmo tipo.

Outra solução semelhante à aceita é usar a palavra-chave default C #. Embora definido usando genéricos, é realmente aplicável a qualquer tipo.

Exemplo de uso aplicado à pergunta do OP:

 Nullable foo; foo = true ? default(DateTime) : new DateTime(0); 

Exemplo de uso com a resposta aceita atual:

 DateTime? foo; foo = true ? default(DateTime) : new DateTime(0); 

Além disso, usando o default , você não precisa especificar a variável como nullable para atribuir um valor null . O compilador atribuirá automaticamente o valor padrão específico do tipo de variável e nenhum erro será encontrado. Exemplo:

 DateTime foo; foo = true ? default(DateTime) : new DateTime(0); 

Eu sei que esta pergunta foi feita em 2008 e agora é 5 anos mais tarde, mas a resposta marcada como uma resposta não me satisfaz. A resposta real é que DateTime é uma estrutura e, como uma estrutura, não é compatível com null. Você tem duas maneiras de resolver isso:

A primeira é tornar o null compatível com DateTime (por exemplo, converter null em DateTime? Como o gentleman com 70 votos positivos sugere, ou converter null em Object ou ValueType).

A segunda é tornar o DateTime compatível com null (por exemplo, converter DateTime em DateTime?).