6
votes

Jeter ma classe à int 2004, double etc.


1 commentaires

Pourquoi utilisez-vous les deux long et int64 ? L'un est un aloas pour l'autre et je pense que la manière la plus idiomatique est d'utiliser les alias si elles existent au lieu des noms de type.


3 Réponses :


9
votes

Pour cette conversion pour travailler, vous auriez besoin d'un explicite Conversion à int64.

Cela ressemblerait à: xxx


4 commentaires

Pourquoi devrait-il être explicite? Une conversion implicite fonctionne également et la distribution devient facultative.


@Jay You pourrait faire une opération implicite, mais l'OP a montré, y compris l'opérateur de conversion. Personnellement, j'ai tendance à essayer d'éviter les conversions implicites à moins d'avoir beaucoup de sens (la conversion implicitement du double à long semble être une mauvaise idée, cependant).


J'ai laissé les cases explicites lorsque la précision ou la perte de données pourrait être une question. Cependant, j'ai fait de la montaine à doubler implicite car ma classe est fondamentalement juste un double.


@Jay S'il vous plaît voir ma réponse modifiée pour des raisons pour lesquelles la conversion devrait être explicite.



1
votes

Il y a une conversion explicite du Double en 364, mais pas de votre classe à INT64. Tout ce que vous avez à faire est de définir un. Ou, si vous avez une conversion de votre classe en double, que je suppose que vous puissiez faire, vous pouvez le faire:

long x = (long) (double) a; p>

Toutefois, c'est encombrant; Je définirais l'opérateur de conversion explicite. P>

La conversion doit être explicite, non implicite, à moins que vous n'ayez une bonne raison de la rendre explicite. P>

La conversion définie par la langue du double à long terme est explicite parce que la conversion pourrait causer une perte d'informations. EM> Vous pouvez perdre des informations avec cette conversion car il y a des doubles, comme 0.5, qui ne convertissent pas exactement. em> Ceci s'appelle une conversion rétrécissement em>. P>

avec des conversions définies par la langue, les conversions de rétrécissement sont explicites. S'ils étaient implicites, les programmeurs pourraient perdre accidentellement des informations en attribuant une valeur d'un type à une variable d'un autre type. Définir cette conversion en tant que implicite viole ce principe entièrement sensible, il faudrait donc avoir une affaire convaincante pour le faire. P>

Voici un exemple montrant la valeur de ce principe. Si les conversions de rétrécissement étaient implicites, cela rendrait le code plus fragile. Supposons que la conversion double à int est implicite: p> xxx pré>

oups! Nous avons un bug! GestaVeragenumberOfchildren code> devrait retourner un double! Fixez-le! P>

double GetAverageNumberOfChildren(IEnumerable<Family> families)
{
    return families.Average(f => f.Children.Count);
}


0 commentaires

1
votes

Une conversion implicite fonctionnera ainsi qu'une conversion explicite.

long b = a;


3 commentaires

C'est vrai, mais dangereux. Voir ma réponse modifiée pour une explication.


@Phoog je comprends. Je ne faisais que parler avec le "vous besoin une conversion explicite".


Assez juste; Je pensais juste que si nous discutons de l'existence de conversions implicites, il serait sage de discuter des raisons de faire des conversions de réduction explicites. Sinon, quelqu'un pourrait être tenté de mettre en œuvre une conversion qui devrait être explicite comme une conversion implicite "car elle est plus facile" ou "car elle rend mon nettoyeur de code", sans tenir compte de la probabilité accrue de la rédaction de programmes de buggy.