Je suis surpris qu'il semble y avoir un consensus ici que la non-virtuel par défaut est la bonne façon de faire les choses. Je vais descendre sur l'autre - je pense que pragmatique côté de la barrière.
La plupart des justifications de me lire comme la vieille "Si nous vous donnons le pouvoir vous risquez de vous blesser vous-même" argument. De programmeurs?!
Il me semble que le codeur qui ne savent pas (ou n'ont pas assez de temps) pour la conception de leur bibliothèque pour l'héritage et/ou de l'extensibilité est le codeur qui est produit exactement la bibliothèque, je suis susceptible de corriger ou ajuster exactement la bibliothèque où la possibilité de remplacer viendrait en plus utile.
Le nombre de fois où j'ai eu à écrire laid, désespérée de travail autour de code (ou de l'abandon de l'utilisation et de rouler ma propre solution alternative) parce que je ne peux pas remplacer loin, l'emporte de loin sur le nombre de fois où j'ai déjà été mordu (par exemple en Java) en substituant où le concepteur peut ne pas avoir pensé que je pourrais.
Non-virtuelle-par-défaut me rend la vie plus difficile.
Mise à JOUR: Il a été souligné [justement] que je n'ai pas réellement répondre à la question. - Et avec mes excuses pour être un peu tard....
J'ai un peu envie d'être capable d'écrire quelque chose lapidaires comme "C# implémente les méthodes non-virtuel par défaut, car une mauvaise décision qui accordait de l'importance des programmes les plus fortement que les programmeurs". (Je pense que ça pourrait être quelque peu justifié sur la base de certains des autres réponses à cette question à la performance (optimisation prématurée, anyone?), ou de garantir le comportement des classes.)
Cependant, je me rends compte que je venais d'énoncer mon opinion et pas de réponse définitive que le Débordement de la Pile de désirs. Sûrement, je pensais que, au plus haut niveau de l'définitive (mais inutile) la réponse est:
Ils sont non-virtuel par défaut, parce que la langue-les concepteurs ont une décision à prendre et c'est ce qu'ils ont choisi.
Maintenant, je suppose que la raison exacte, ils ont pris cette décision, nous allons jamais.... oh, attendez! La transcription d'une conversation!
Il semblerait donc que les réponses et les commentaires ici sur les dangers de l'impérieuse d'Api et de la nécessité de concevoir explicitement pour l'héritage sont sur la bonne voie, mais sont tous manquent un important aspect temporel: Anders " la principale préoccupation était sur le maintien d'une classe ou de l'API de contrat implicite entre les versions. Et je pense qu'il est plus préoccupé par permettant aux .Net / C# plate-forme pour le changement sous le code plutôt que préoccupés par l'utilisateur changer le code sur le dessus de la plate-forme. (Et son "pragmatique" point de vue est à l'exact opposé de la mienne, parce qu'il est à la recherche de l'autre côté.)
(Mais ils ne pourraient pas avoir choisi virtuel par défaut, puis parsemé de "finale" par le biais de la base de code? C'est peut-être pas tout à fait la même chose.. et Anders, c'est clairement plus intelligent que moi, donc je vais laisser mentir.)