Quindi ho letto Eric Lippert's 'Constraints are not part of the signature' e ora capisco che le specifiche specificano che i vincoli di tipo vengono controllati DOPO la risoluzione di sovraccarico, ma non sono ancora chiaro sul perché questo DEVE essere il caso. Di seguito è riportato l'esempio di Eric:Perché la restrizione del tipo non è parte della firma del metodo?
Questo non viene compilato perché la risoluzione di sovraccarico per: Foo(new Giraffe())
ne deduce che Foo<Giraffe>
è la miglior partita di sovraccarico, ma poi i vincoli di tipo falliscono e un errore di compilazione viene generata. Nelle parole di Eric:
Il principio è la risoluzione di sovraccarico (e il tipo di metodo di deduzione) trovare la migliore corrispondenza possibile tra un elenco di argomenti e la lista di ogni metodo candidato di parametri formali. Cioè, guardano la firma del metodo candidato.
I vincoli di tipo NON fanno parte della firma, ma perché non possono essere? Quali sono alcuni scenari in cui è una cattiva idea considerare i vincoli di tipo parte della firma? È solo difficile o impossibile da implementare? Non sto sostenendo che se il sovraccarico scelto migliore è per qualsiasi motivo impossibile da chiamare, allora silenziosamente ripiego al secondo migliore; Lo odierò. Sto solo cercando di capire perché i vincoli di tipo non possono essere utilizzati per influenzare la scelta del sovraccarico migliore.
sto immaginando che internamente al compilatore C#, solo per scopi di risoluzione di sovraccarico (non riscrivere in modo permanente il metodo), il seguente:
static void Foo<T>(T t) where T : Reptile { }
si trasforma a:
static void Foo(Reptile t) { }
Perché non è possibile "inserire" i vincoli di tipo nell'elenco dei parametri formali? In che modo questo cambia la firma in modo negativo? Sento che rafforza solo la firma. Quindi Foo<Reptile>
non sarà mai considerato un candidato sovraccarico.
Modifica 2: Nessuna meraviglia che la mia domanda fosse così confusa. Non ho letto correttamente il blog di Eric e ho citato l'esempio sbagliato. Ho modificato nell'esempio che ritengo più appropriato. Ho anche cambiato il titolo per essere più specifico. Questa domanda non sembra semplice come ho immaginato, forse mi manca qualche concetto importante. Sono meno sicuro che si tratti di materiale stackoverflow, potrebbe essere meglio spostare questa domanda/discussione altrove.
Il bit sulle iguane che hai citato nella parte superiore della tua domanda aveva lo scopo di illustrare una situazione in cui l'inferenza di tipo * fa * un vincolo in considerazione, vale a dire, il vincolo su T in C, e quindi la risoluzione di sovraccarico in ultima analisi sceglie il metodo * non generico * in questo esempio. Sei * sicuro * che è il pezzo rilevante dell'articolo che intendi citare per porre questa domanda? Il resto della domanda non sembra seguire logicamente da esso. –
Penso piuttosto che volevi chiedere perché è quando l'inferenza di tipo * ha esito positivo * ma deduce un tipo che viola un vincolo * sul parametro tipo di metodo *, perché la risoluzione di sovraccarico non riesce quando c'è un'alternativa. Sto trovando questa domanda molto confusa, ma poi di nuovo, è una parte confusa delle specifiche. –
Hai ragione. Ho letto male il tuo blog e ho usato l'esempio sbagliato. Nessuna meraviglia che la mia domanda fosse così confusa. Ho cercato di chiarire la mia domanda nel miglior modo possibile; Inoltre leggerò alcuni dei tuoi altri post sul blog per vedere se riesco a migliorare la mia comprensione sull'argomento. – Daryl