Ho appena incontrato questo (codice formato da dimostrare il "problema"):Il tipo dell'espressione condizionale non può essere deterministico estratto?
public ICollection<string> CreateCollection(int x)
{
ICollection<string> collection = x == 0
? new List<string>()
: new LinkedList<string>();
return collection;
}
Il compilatore si lamenta: CS0173
errore: Il tipo di espressione condizionale non può essere determinato, perché nessuno conversione implicita tra 'System.Collections.Generic.List 'e' System.Collections.Generic.LinkedList "si svolge.
Quali tardive trans grosso modo:
Il tipo di operatore condizionale non può essere estratto deterministico, perché non c'è alcuna conversione implicita tra List e LinkedList.
Posso capire perché il compilatore si lamenta, ma hey, andiamo. Sta cercando di suonare stupido. Vedo fatto Entrambe le espressioni non sono dello stesso tipo, ma hanno un antenato comune e come bonus il tipo del lato sinistro è quindi un antenato comune. Sono sicuro che anche il compilatore può vederlo. Potrei capire l'errore se il leftside che ha dichiarato come var
.
Che cosa mi manca qui?
Edit:
sto accettando la spiegazione di James Gaunt. Forse basta chiarire. Posso leggere le specifiche del compilatore bene. Volevo capire perché. Perché qualcuno ha preso la decisione di scrivere le specifiche in questo modo. Ci deve essere una ragione dietro questo design. Secondo James, il principio di design è "senza sorprese". Così CodeInChaos Spiega quali sorprese si potrebbero incontrare se il compilatore avrebbe cercato di dedurre il tipo da antenati comuni.
Provare a inserire un cast esplicito su 'ICollection' su uno dei risultati condizionali. –
So come aggirarlo, voglio solo capirlo. – EricSchaefer
e se ...il compilatore creerebbe un tipo anonimo che (A) implementasse tutte le interfacce comuni (B) come un wrapper per l'oggetto selezionato? – m0sa