Il m'est arrivé de parcourir le code source de l'infrastructure .net et de passer à travers l'implémentation de l'opérateur explicite pour l'implémentation struct Nullable. Les captures d'écran ci-dessous montrent l'implémentation de la propriété Value et aussi l'implémentation de l'opérateur explicite. Je comprends également que l'opérateur explicite tente de convertir Nullable à T. Ma question est pourquoi est-il pas que le code suivant n'est pas jeter une exceptionConfusion à propos de l'implémentation de l'opérateur explicite pour Nullable <T> struct
mise en œuvre du cadre
public T Value {
get {
if (!HasValue) {
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue);
}
return value;
}
}
public static explicit operator T(Nullable<T> value) {
return value.Value;
}
Code Custome
int? i = null;
int? i2 = (int?)i; //No Error
int? i = null;
int i2 = (int)i; //Runtime error
Il est dit value.Value et, idéalement, puisque HasValue sera faux (puisque j'ai assigné une valeur nulle), il devrait renvoyer une exception d'opération invalide, mais il affecte heureusement la valeur à i2. Cependant, au lieu de (int?) I si nous le changeons en (int), la propriété InvalidOperatorException from Value est levée. Ma pensée était quand value.Value est appelée, elle lèvera une exception parce que cette propriété est accédée et elle fera son travail.
S'il vous plaît préciser sur la même
Merci,
Sai Pavan
(comme dans le premier cas) il doit appeler le droit de la propriété droit? Dans un tel scénario quand il est appelé, il doit lever l'exception car HasValue sera faux. Pourriez-vous s'il vous plaît laissez-moi savoir comment cela fonctionne dans ce scénario? – usaipavan
@usaipavan HasValue ne sera jamais appelé parce que le nullable est simplement copié sans appeler aucun opérateur explicite car il y a un opérateur défini pour 'T?' (Qui ne fonctionnera pas de toute façon). –