Problema comprensione C # inferenza di tipo come descritto nella specifica del linguaggio
-
02-10-2019 - |
Domanda
Il C # linguaggio di specifica descrive l'inferenza di tipo nella sezione §7.5.2. C'è un dettaglio in esso che non capisco. Si consideri il seguente caso:
// declaration
void Method<T>(T obj, Func<string, T> func);
// call
Method("obj", s => (object) s);
Sia la Microsoft e Mono C # compilatori correttamente dedurre T
= object
, ma la mia comprensione dell'algoritmo nella specifica sarebbe resa T
= string
e poi fallire. Ecco come ho capito:
La prima fase
-
Se Ei è una funzione anonima, un tipo di parametro esplicito l'inferenza (§7.5.2.7) è fatto da Ei a Ti
? non ha alcun effetto, perché l'espressione lambda non ha tipi di parametri espliciti. Giusto?
-
Altrimenti, se Ei ha un tipo U e xi è un parametro di valore poi un abbassare-bound inferenza è costituito da U a Ti.
? il primo parametro è di tipo
string
statico, quindi questo aggiungestring
ai limiti inferiori perT
, giusto?
La seconda fase
-
Tutte unfixed variabili di tipo Xi quali no dipendono (§7.5.2.5) qualsiasi Xj sono fissi (§7.5.2.10).
?
T
è slegato;T
non dipende da nulla ... cosìT
dovrebbe essere risolto, giusto?
§7.5.2.11 fissaggio
-
L'insieme di tipi di candidati Uj inizia come l'insieme di tutti i tipi nel set di limiti per Xi.
? {
string
(limite inferiore)} -
Abbiamo poi esaminare ciascun vincolato per Xi, in sequenza: [...] Per ciascuna U limite inferiore di Xi tutti i tipi Uj a cui non v'è una conversione implicita da U vengono rimossi dal set candidato. [...]
? non rimuove nulla dal set candidato, giusto?
-
Se tra i tipi candidati rimanenti Uj v'è un unico tipo V da cui v'è una conversione implicita a tutti gli altri tipi di candidati, allora Xi è fissata a V.
? Poiché v'è un solo tipo di candidato, questo è banalmente vero, in modo da Xi è fissato a
string
. Giusto?
sbagliato Allora, dove sto andando?
Soluzione
UPDATE: La mia prima indagine sul bus questa mattina era incompleta e sbagliata. Il testo della prima specifica fase è corretta. L'implementazione è corretta.
La specifica è sbagliata in quanto ottiene l'ordine degli eventi sbagliate nella seconda fase. Dovremmo specifichiamo che facciamo con uscita inferenze prima fissiamo i parametri non dipendenti.
L'uomo, questa roba è complicato. Ho riscritto questa sezione della specifica più volte di quanto posso ricordare.
Ho visto questo problema prima, e ho distintamente ricordare facendo revisioni in modo tale che il termine "tipo di variabile" errato è stato sostituito in tutto il mondo con il "parametro type". (Parametri di tipo non sono posizioni di archiviazione i cui contenuti possono variare, quindi non ha senso chiamarli variabili.) Credo che allo stesso tempo ho notato che l'ordinamento è stato sbagliato. Probabilmente ciò che è successo è stato che abbiamo accidentalmente spedito una versione precedente delle specifiche sul web. Molte scuse.
I lavorerà con Mads per ottenere le specifiche aggiornato in modo che corrisponda l'attuazione. Penso che la corretta formulazione della seconda fase dovrebbe andare qualcosa come questo:
- Se nessun parametro di tipo non fissati esistono poi inferenza di tipo riesce.
- In caso contrario, se esiste uno o più argomenti Ei con corrispondente tipo di parametro Ti tali che il tipo di uscita di Ei con il tipo di Ti contenente almeno un unfixed tipo parametro Xj, e nessuno dei tipi di ingresso di Ei con tipo Ti contiene qualsiasi unfixed tipo parametro Xj, poi un tipo di output inferenza è costituito da tutte queste Ei a Ti.
o meno il passaggio precedente in realtà ha fatto una deduzione, abbiamo ora deve risolvere almeno un parametro di tipo, come segue:
- Se esiste uno o più parametri di tipo tale che Xi Xi è slegato, e Xi ha un insieme non vuoto limite, e Xi non dipende da alcuna Xj quindi ogni tale Xi è fisso. Se una qualsiasi operazione di fissaggio non riesce poi inferenza di tipo non riesce.
- Altrimenti, se esiste uno o più parametri di tipo tale che Xi Xi è slegato, e Xi ha un insieme non vuoto limite, e v'è almeno un tipo di parametro Xj che dipende Xi quindi ogni tale Xi è fisso. Se una qualsiasi operazione di fissaggio non riesce poi inferenza di tipo non riesce.
- In caso contrario, siamo in grado di fare progressi e ci sono parametri non fissati. L'inferenza di tipo non riesce.
Se il tipo di inferenza non riesce né riesce quindi la seconda fase viene ripetuta.
L'idea qui è che vogliamo garantire che l'algoritmo non va mai in un ciclo infinito. Ad ogni ripetizione della seconda fase riesce nemmeno fallisce, o faccia progressi. Non può forse ciclo più volte che ci sono parametri di tipo per fissare ai tipi.
Grazie per aver portato questo alla mia attenzione.