Parce que la spécification du langage s'attend à une expression de type System.Exception
(donc, null
est valable dans ce contexte) et de ne pas restreindre cette expression non-null. En général, il n'y a aucune manière qu'il pourrait détecter si la valeur de cette expression est - null
ou pas. Il aurait à résoudre le problème de l'arrêt. Le moteur d'exécution à traiter avec de l' null
de cas de toute façon. Voir:
Exception ex = null;
if (conditionThatDependsOnSomeInput)
ex = new Exception();
throw ex;
Ils pourraient, bien sûr, faire le cas spécifique de jeter l' null
littérale invalide, mais qui ne serait pas d'une grande aide, alors pourquoi gaspiller de la spécification de l'espace et de réduire la cohérence pour peu d'avantages?
Disclaimer (avant que je sois frappé par Eric Lippert): C'est mon propre spéculation sur le raisonnement derrière cette décision de conception. Bien sûr, je n'ai pas été dans la conception de réunion ;)
La réponse à votre deuxième question, à savoir si une expression variable capturé dans une clause catch peut jamais être nulle: Alors que le C# spécification est muette quant à savoir si d'autres langues peuvent causer null
exception à être propagées, il n'définir la façon dont les exceptions sont propagées:
Les clauses catch, le cas échéant, sont examinées dans l'ordre d'apparition à trouver un gestionnaire pour l'exception. La première clause catch qui spécifie le type d'exception ou d'un type de base du type d'exception est considéré comme une correspondance. Un général de la clause catch est considéré comme un match pour n'importe quel type d'exception. [...]
Pour null
, l'audacieuse affirmation est fausse. Ainsi, tout en se basant uniquement sur ce que le C# spec dit, on ne peut pas dire que le sous-jacent d'exécution ne jamais jeter nulle, on peut être sûr que, même si c'est le cas, elle va être traitées par le générique de l' catch {}
de la clause.
Pour C# implémentations sur la CLI, nous pouvons nous référer à l'ECMA 335 spécification. Ce document définit toutes les exceptions que la CLI jette à l'interne (aucun n' null
), et mentionne que définis par l'utilisateur exception des objets sont lancés par l' throw
enseignement. La description pour que l'instruction est pratiquement identique à C# throw
déclaration (sauf qu'il n'a pas restreindre le type de l'objet d' System.Exception
):
Description:
L' throw
instruction lève l'exception de l'objet (type O
) sur la pile et vide la pile. Pour les détails du mécanisme d'exception, consultez la Partition de I.
[Remarque: lors de la CLI permet à n'importe quel objet à être jetés, le CEMAT a décrit une exception spécifique de la classe qui sera utilisée pour l'interopérabilité de langue. la note de fin]
Exceptions:
System.NullReferenceException
est levée si obj
est null
.
Exactitude:
Corriger CIL s'assure que l'objet est toujours soit en null
ou une référence d'objet (c'est à dire, de type O
).
Je crois que ce sont suffisantes pour conclure pris exceptions ne sont jamais null
.