Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Confusion with C# Enum and Explicit conversion

Tags:

c#

enums

casting

I have the following 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
    }

Which I use here -->

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

What I don't understand is why, if int is default enum governing type, do I have to CAST this line, like so -->

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

Forgive my ignorance I just like to understand the why of things not just that they are so.

like image 212
Refracted Paladin Avatar asked Dec 29 '22 17:12

Refracted Paladin


1 Answers

There just isn't an implicit conversion from an enum type to its underlying type. This makes it harder to accidentally use an enum as its numeric value.

(There's likewise no conversion the other way.)

There is an implicit conversion from the constant 0 to any enum type, by the way.

Oh, and unboxing from a boxed enum value to its underlying type - or vice versa - works too. At least at one point this was really badly mangled in both the CLI spec and the C# spec; it may well have been fixed by now :)

EDIT:

Here's an alternative option if you actually just want to use the values as numbers:

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

Alternatively, write a method like this:

static void ReportProgress(SyncStatus status)
{
    SyncInBackground.ReportProgress((int) status);
}
like image 124
Jon Skeet Avatar answered Jan 07 '23 08:01

Jon Skeet