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 aggiunge string ai limiti inferiori per T, 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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top