Pour des raisons connues de Microsoft, le framework évalue IPAddress.Parse("0.0.0.0")
en utilisant leurs objectIDs plutôt que leurs valeurs lorsque vous demandez une comparaison au niveau de l'objet. Autrement dit, vous demandez si les deux sont le même objet (c'est-à-dire des pointeurs internes vers les valeurs stockées) plutôt que la même valeur.
Cependant, vous pouvez obtenir ce que vous recherchez en utilisant la méthode Equals()
:
IPAddress ipMine = IPAddress.Parse("0.0.0.0");
IPAddress ipAny = IPAddress.Any;
Console.WriteLine(ipMine == ipAny); // produira false
Console.WriteLine(ipMine.Equals(ipAny)); // produira true
La gestion implicite intégrée du framework des objets de base (int, float, string, etc) comme des types primitifs aux bons moments nous gâte parfois, et il vaut toujours la peine de se rappeler que pour les types complexes, .NET les traitera, par défaut, comme des références à moins que l'auteur implémente explicitement des méthodes d'opérateur. Dans le cas ci-dessus, MS a décidé qu'il était plus utile que le comportement par défaut soit la comparaison par réf, mais Equals
devrait toujours faire une comparaison basée sur la valeur, donc tout va bien.