Je sais que Java du type de système est malsain (il ne parvient pas à la vérification du type des constructions qui sont sémantiquement juridique) et de l'indécidable (il ne parvient pas saisir, vérifier certaines de construire).
Par exemple, si vous copiez/collez le code suivant dans une classe et le compiler, le compilateur va se planter avec un StackOverflowException
(comment apt). C'est l'indécidabilité.
static class ListX<T> {}
static class C<P> extends ListX<ListX<? super C<C<P>>>> {}
ListX<? super C<Byte>> crash = new C<Byte>();
Java utilise des caractères génériques avec le type de limites, qui sont une forme d'utilisation-site de la variance. C# d'autre part, les utilisations de la déclaration de site annotation de variance (avec l' in
et out
mots-clés). Il est connu que la déclaration-site de la variance est plus faible qu'à l'utilisation du site de la variance (utilisation de la variance peut tout exprimer déclaration-site écart, et plus encore-sur le côté vers le bas, c'est beaucoup plus clair).
Donc ma question est: Est C# type de système de son et decidable? Si non, pourquoi?