Mam następujący sposób:Jak uzyskać kompilator C# do wnioskowania rodzajów ogólnych?
public TResult Get<TGenericType, TResult>()
where TGenericType : SomeGenericType<TResult>
where TResult : IConvertible {
//...code that uses TGenericType...
//...code that sets someValue...
return (TResult) someValue;
}
Teraz użytkownik tej metody używać go tak:
//Notice the duplicate int type specification
int number = Get<SomeGenericType<int>, int>();
Dlaczego muszę określić TResult w metodzie umowach definicja? Kompilator zna już TRESult, ponieważ określiłem go w TGenericType. Idealnie (jeśli kompilator C# był trochę mądrzejszy), moja metoda będzie wyglądać następująco:
public TResult Get<TGenericType>()
where TGenericType : SomeGenericType<TResult>
where TResult : IConvertible {
//...code that uses TGenericType...
//...code that sets someValue...
return (TResult) someValue;
}
więc użytkownik może po prostu używać go tak:
//Much cleaner
int number = Get<SomeGenericType<int>>();
Czy istnieje sposób, aby zrobić co chcę robić?
Myślę, że usunięcie niektórych kwalifikatorów, takich jak * głupi * z opisu pytania, pomoże. – EFraim
To jest kompilator, który jest głupi, prawda? ;) Usunąłem obcy komentarz. Bez tego właściwie jest to rozsądne pytanie. –
Ponieważ otrzymałeś odpowiedź, że nie ma sposobu, aby użyć tylko niektórych parametrów typu, być może powinieneś przeformułować swoje pytanie pod kątem tego, co chcesz osiągnąć. W obecnej formie, twoje pytanie brzmi: "w jaki sposób mogę skompilować kompilator C#, który narusza definicję języka C#?" Jako taki powinien być zamknięty jako "nie jest to prawdziwe pytanie". –