Question

Je viens de voir qu'il utilisait dans l'une des réponses récentes:

public static implicit operator bool(Savepoint sp)
{
    return sp != null;
}

Pourquoi avons-nous besoin mot implicite ici, et qu'est-ce que cela signifie?

Était-ce utile?

La solution

Implicite signifie que la conversion ne nécessite pas une distribution dans votre code.

Vous pouvez maintenant faire ceci:

Savepoint point = new Savepoint();
if(point) // becomes a bool using your operator
{
}

au lieu d'avoir à faire ceci:

Savepoint point = new Savepoint();
if((bool)point) // an "explicit" conversion
{
}

Un exemple de pourquoi il en est une distinction utile est les types numériques. Il y a une conversion implicite de types « petits » à des types « grands », par exemple:

float f = 6.5;
double d = f; // implicit conversion

Mais la conversion de types plus grands à des types plus petits peuvent être dangereux, donc il n'y a qu'une conversion explicite, ce qui oblige l'utilisateur à préciser qu'il a vraiment l'intention d'effectuer l'opération en question:

long l = 20;
// short s = l;
short s = (short)l;  // explicit conversion

Autres conseils

Cela ressemble à une mauvaise utilisation d'un opérateur implicite. Je ne sais pas ce que la classe ne du point de sauvegarde, mais la conversion à un booléen ne semble pas logique. L'opérateur implicite vous permet de vérifier si une référence est nul ou point d'enregistrement non en évaluant simplement la référence:

if (point) {

au lieu de:

if (point != null) {

S'il est utilisé de cette façon, qui se cache ce que le code est en train de faire, et qui va à l'encontre à peu près tout ce que C # est sur le point.

Il suffit d'ajouter à la réponse de mquander.

A partir de la spécification du langage C # 3.0:

  

Une déclaration de l'opérateur de conversion   comprend le mot-clé implicit   introduit un implicite défini par l'utilisateur   conversion. Les conversions implicites peuvent   se produire dans une variété de situations,   y compris les appels de fonction de membre,   jeter les expressions et les affectations.

(section 10.10.3)

Opérateurs de conversion convertissent d'un type à l'autre. signifie implicitement que vous n'avez pas à taper un casting explicite dans le code pour la conversion arriver, explicite exige CAST dans le code à appeler.

Vous utilisez l'opérateur de conversion implicite lorsque vous êtes certain que la conversion ne perd pas de données. Par exemple, avec l'élargissement de coercitions (int -> long, float -> double). opérateurs de conversion explicites sont utilisés quand un état est perdu ou vous ne voulez pas compilateur visser automatiquement le code client en insérant des conversions dans tous les sens.

Une conversion comme la vôtre serait vraiment faire des ravages car il est déconseillé d'effectuer cette conversion particulière.

Vous devez spécifier « implicite », car il y a aussi des opérateurs explicites.

Cela signifie que la conversion entre booléenne et un point d'enregistrement peut être effectuée implicitement, par exemple, = Caché.

Savepoint s = new Savepoint();
bool b = s;

Conversion explicite, par exemple évident, peut être fait de cette façon:

 Savepoint s = new Savepoint();
 bool b = (bool)s;

La conversion implicite est souvent utilisé quand il n'y a pas de perte de données possible, à savoir Int16 (short) à Int32 (int). Mais s'il est possible, vous devez « d'accord » avec l'aide de conversion explicite.

Dans votre cas, par exemple, si Savepoint est juste un

struct Savepoint
{
  public bool data;
}

vous pouvez utiliser la conversion implicite, car aucune perte de données est possible:

Savepoint s = new Savepoint();
s.data = true;
bool b = s;

sinon, je vous recommande de définir l'opérateur explicite!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top