Ho il seguente metodo:Come ottenere il compilatore C# per inferire tipi generici?
public TResult Get<TGenericType, TResult>()
where TGenericType : SomeGenericType<TResult>
where TResult : IConvertible {
//...code that uses TGenericType...
//...code that sets someValue...
return (TResult) someValue;
}
In questo momento, un utente di questo metodo deve usare in questo modo:
//Notice the duplicate int type specification
int number = Get<SomeGenericType<int>, int>();
Perché devo specificare TResult nel metodo defintion? Il compilatore conosce già TResult da quando l'ho specificato in TGenericType. Idealmente (se il compilatore C# è stato un po 'più intelligente), il mio metodo sarà simile a questa:
public TResult Get<TGenericType>()
where TGenericType : SomeGenericType<TResult>
where TResult : IConvertible {
//...code that uses TGenericType...
//...code that sets someValue...
return (TResult) someValue;
}
Così l'utente può semplicemente usare in questo modo:
//Much cleaner
int number = Get<SomeGenericType<int>>();
C'è un modo per farlo cosa voglio fare?
Penso che rimuovere alcuni qualificatori come * stupido * dalla descrizione della domanda aiuterà. – EFraim
È il compilatore che è stupido, giusto? ;) Ho rimosso il commento estraneo. Questa è in realtà una domanda ragionevole senza di essa. –
Dato che hai risposto che non è possibile utilizzare solo alcuni dei parametri dei tipi, forse dovresti riformulare la tua domanda in termini di ciò che vorresti ottenere. Così com'è, la tua domanda è "come faccio a compilare il codice compilatore C# che viola la definizione del linguaggio C#?" Come tale, dovrebbe essere chiuso come "non una vera domanda". –