混淆C#Enum和显式转换

Ref*_*din 4 c# enums casting

我有以下枚举 - >

    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
    }
Run Code Online (Sandbox Code Playgroud)

我在这里使用 - >

        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); 
Run Code Online (Sandbox Code Playgroud)

我不明白为什么,如果int is default enum governing type,我必须CAST这样,这样 - >

 SyncInBackground.ReportProgress((int)SyncStatus.Checking);
Run Code Online (Sandbox Code Playgroud)

原谅我的无知我只想了解事情的原因而不仅仅是因为它们是如此.

Jon*_*eet 10

只是没有从枚举类型到其基础类型的隐式转换.这使得意外使用枚举作为其数值更加困难.

(其他方面也没有转换.)

存在从恒定0到任何枚举类型的隐式转换,顺便.

哦,从盒装枚举值到其底层类型的拆箱 - 或反之亦然 - 也有效.至少在某一点上,CLI规范和C#规范都严重受损; 它现在可能已被修复:)

编辑:

如果您实际上只想将值用作数字,那么这是另一种选择:

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;
}
Run Code Online (Sandbox Code Playgroud)

或者,写一个这样的方法:

static void ReportProgress(SyncStatus status)
{
    SyncInBackground.ReportProgress((int) status);
}
Run Code Online (Sandbox Code Playgroud)