2009-08-11 3 views
4

У меня есть следующие перечисления ->Путаница с C# Enum и Явное преобразование

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 
    } 

, который я использую здесь ->

 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); 

То, что я не понимаю, почему, если int is default enum governing type , я должен CAST этой линии, как так ->

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

Простите мое невежество, я так же, как в понимайте, почему не только то, что они есть.

+2

Не является перечислением, по существу, типа «?». ReportProgress ожидает int, а не SyncStatus, поэтому вам нужно бросить. Мое предположение. –

ответ

10

Только что неявное преобразование из типа перечисления в его базовый тип. Это усложняет случайно использует перечисление как его числовое значение.

(Там нет также никакого преобразования в другой стороне.)

Там является неявного преобразования из константы 0 до любого перечислимого типа, кстати.

О, и unboxing из значения, указанного в боксе, в его базовый тип - или наоборот - тоже работает. По крайней мере, в какой-то момент это действительно сильно исказилось как в спецификации CLI, так и в спецификации C#; она вполне может быть исправлена ​​теперь :)

EDIT:

Вот альтернативный вариант, если вы фактически просто хотите использовать значения в виде чисел:

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; 
} 

В качестве альтернативы, написать метод например:

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

Итак, независимо от того, какой тип я могу сделать для своего перечисления, мне всегда нужно будет перевести его в тот тип, где мне может понадобиться его использовать? Мотивировка состоит в том, чтобы защитить меня от себя? Я прав? –

+0

Yup. Если вам нужны целые числа, вместо этого используйте статический класс с константами. –

+1

:) Спасибо, моя конечная цель состояла в том, чтобы иметь возможность использовать 'int' для панели progress и' string' для управления меткой. Похоже, что я, возможно, использовал неправильный инструмент .... –

Смежные вопросы