52 votes

Opérations mathématiques avec null

Veuillez expliquer pourquoi ce test réussit ?

 [Test]
public void TestNullOps()
{
    Assert.That(10 / null, Is.Null);
    Assert.That(10 * null, Is.Null);
    Assert.That(10 + null, Is.Null);
    Assert.That(10 - null, Is.Null);
    Assert.That(10 % null, Is.Null);
    Assert.That(null / 10, Is.Null);
    Assert.That(null * 10, Is.Null);
    Assert.That(null + 10, Is.Null);
    Assert.That(null - 10, Is.Null);
    Assert.That(null % 10, Is.Null);

    int zero = 0;
    Assert.That(null / zero, Is.Null);
}

Je ne comprends même pas comment ce code compile.

On dirait que chaque expression mathématique avec null renvoie Nullable<T> (par exemple, 10 / null est un Nullable<int> ). Mais je ne vois pas de méthodes d'opérateur dans la classe Nullable<T> Si ces opérateurs sont extraits de int , pourquoi la dernière assertion n'échoue-t-elle pas ?

17voto

Marc Gravell Points 482669

Les opérateurs pour Nullable<T> sont des opérateurs dits « levés »] ; le compilateur c# prend les opérateurs disponibles pour T et applique un ensemble de règles prédéfinies ; par exemple, avec + , le + levé est null si l'un des opérandes est nul, sinon la somme des valeurs internes. Re le dernier; encore une fois, la division est définie comme null si l'un des opérandes est null - il n'effectue jamais la division.

2voto

J'ai essayé de voir le code généré à partir du code ci-dessous à l'aide de reflector

 var myValue = 10 / null;

Et le compilateur le transforme en ceci :

 int? myValue = null;

Et cela ne compilera pas, vous ne pouvez donc pas le tromper :

 object myNull = null;
var myValue = 10 / myNull;

1voto

Polynomial Points 12830

Je suppose que le compilateur convertit zero en Nullable<int> , et fournit l'opérateur de division sous-jacent. Comme le type Nullable peut être nul, la division par 0 n'est pas interceptée lors de la compilation. La meilleure hypothèse est qu'ils veulent que vous puissiez effectuer des tests nuls dans les cas où div/0 se produit.

0voto

Sohil Points 11

Les opérations de cette liste renvoient toujours NULL :

 1 + 2 + 3 + NULL

5 * NULL - 7

'Home ' || 'sweet ' || NULL

MyField = NULL

MyField <> NULL

NULL = NULL

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X