2009-08-11 7 views
4

je l'ENUM suivante ->Confusion avec C# Enum et conversion explicite

public enum SyncStatus 
    { 
     Unavailable = 0, 
     Checking = 5, 
     StartedAspNetDb = 10, 
     FinishedAspNetDb = 20, 
     StartedMatrixDb = 30, 
     FinishedMatrixDb = 40, 
     StartedConnectDb = 50, 
     FinishedConnectDb = 60, 
     StartedCmoDb = 70, 
     FinishedCmoDb = 80, 
     StartedMcpDb = 90, 
     FinishedMcpDb = 100 
    } 

que j'utilise ici ->

 SyncInBackground.ReportProgress(SyncStatus.StartedAspNetDb); 
     MergeRepl aspnetdbMergeRepl = new MergeRepl(SystemInformation.ComputerName + "\\SQLEXPRESS", "WWCSTAGE", "aspnetdb", "aspnetdb", "aspnetdb"); 
     aspnetdbMergeRepl.RunDataSync(); 
     SyncInBackground.ReportProgress(SyncStatus.FinishedAspNetDb); 

     SyncInBackground.ReportProgress(SyncStatus.StartedMatrixDb); 
     MergeRepl matrixMergeRepl = new MergeRepl(SystemInformation.ComputerName + "\\SQLEXPRESS", "WWCSTAGE", "MATRIX", "MATRIX", "MATRIX"); 
     matrixMergeRepl.RunDataSync(); 
     SyncInBackground.ReportProgress(SyncStatus.FinishedMatrixDb); 

     SyncInBackground.ReportProgress(SyncStatus.StartedConnectDb); 
     MergeRepl connectMergeRepl = new MergeRepl(SystemInformation.ComputerName + "\\SQLEXPRESS", "WWCSTAGE", "CONNECT", "Connect", "Connect"); 
     connectMergeRepl.RunDataSync(); 
     SyncInBackground.ReportProgress(SyncStatus.FinishedConnectDb); 

Ce que je ne comprends pas pourquoi, si int is default enum governing type , dois-je CAST cette ligne, comme si ->

SyncInBackground.ReportProgress((int)SyncStatus.Checking); 

Pardonnez mon ignorance, je tout comme à comprendre le pourquoi des choses, pas seulement qu'ils le sont.

+2

N'est-ce pas une énumération essentiellement un "type?" ReportProgress attend un int, pas un SyncStatus, donc vous devez lancer. Ma conjecture –

Répondre

10

Il n'existe tout simplement pas de conversion implicite d'un type enum en son type sous-jacent. Cela rend plus difficile accidentellement utiliser un enum comme sa valeur numérique.

(Il n'y a également pas de conversion dans l'autre sens.)

Il est une conversion implicite de la constante 0 à tout type d'énumération, par la voie.

Oh, et le déballage d'une valeur enum encadrée à son type sous-jacent - ou vice versa - fonctionne aussi. Au moins à un moment donné, cela a été vraiment mal réparé à la fois dans la spécification CLI et la spécification C#; il peut bien avoir été fixé maintenant :)

EDIT:

Voici une autre option si vous réellement voulez juste utiliser les valeurs que les numéros:

public static class SyncStatus 
{ 
    public const int Unavailable = 0; 
    public const int Checking = 5; 
    public const int StartedAspNetDb = 10; 
    public const int FinishedAspNetDb = 20; 
    public const int StartedMatrixDb = 30; 
    public const int FinishedMatrixDb = 40; 
    public const int StartedConnectDb = 50; 
    public const int FinishedConnectDb = 60; 
    public const int StartedCmoDb = 70; 
    public const int FinishedCmoDb = 80; 
    public const int StartedMcpDb = 90; 
    public const int FinishedMcpDb = 100; 
} 

Vous pouvez également écrire une méthode comme ceci:

static void ReportProgress(SyncStatus status) 
{ 
    SyncInBackground.ReportProgress((int) status); 
} 
+0

Donc, peu importe le type que je pourrais faire mon énumération, je devrai toujours le lancer à ce type où je pourrais avoir besoin de l'utiliser? Le raisonnement est de me protéger de moi-même? Ai-je raison? –

+0

Yup. Si vous voulez des entiers, utilisez plutôt une classe statique avec des constantes. –

+1

:) Merci, mon but ultime était de pouvoir utiliser le 'int' pour une barre de progression et la partie' string' pour un contrôle d'étiquette. On dirait que j'ai peut-être utilisé le mauvais outil .... –