La domanda è alquanto confusa, poiché la domanda non ha nulla a che fare con LINQ, niente a che fare con la varianza generica e presenta un inizializzatore di raccolta, nonché un inizializzatore di oggetti. La vera domanda è, per quanto posso dire "perché non è legale utilizzare un inizializzatore raccolta al di fuori di un'espressione creazione di oggetti?"
Il principio costruttivo rilevante è che, in generale, vogliamo operazioni che creare e inizializzare oggetti per avere la parola "nuovo" in loro da qualche parte come un segnale per il lettore che c'è una creazione di un oggetto che accade qui. (Sì, ci sono alcune eccezioni a questa regola in C#. Come esercizio per il lettore, vedi se riesci a nominarli tutti.)
Fare le cose a modo tuo rende più difficile ragionare sul codice. Veloce, cosa fa questo?
d = new List<int>() { 10, 20, 30 };
d = { 40, 50, 60 };
Ha la seconda linea accodare 40, 50, 60 alla lista già esistente?O sostituisce la vecchia lista con una nuova? Non c'è "nuovo" lì dentro, così il lettore si aspetta che sia stato creato un nuovo oggetto?
Quando si dice
q = new Whatever() { MyList = { 40, 50, 60 } };
che non crea un nuovo elenco; aggiunge 40, 50, 60 a un elenco esistente assegnato dal costruttore. La sintassi proposta è quindi ambigua e confusa sul fatto che venga creato o meno un nuovo elenco.
La funzione proposta è confusa e non necessaria, pertanto è improbabile che venga implementata in tempi brevi.
domanda interessante. –
Penso che il fatto che l'errore del compilatore sia "espressione attesa" è un grande indizio. Nel secondo esempio, la sintassi non indica un'espressione come ci si aspetterebbe di solito non esiste un operatore 'new'. Sospetto che il primo esempio funzioni in quanto è un caso speciale e il compilatore è più rilassato riguardo a ciò che costituisce un'espressione sintatticamente. Il vantaggio delle regole rilassate è la sintassi terser che è altamente auspicabile per il contesto della sintassi di inizializzazione dell'oggetto, altrimenti apparirebbe fugamente. –