【问题标题】:Confusion with C# Enum and Explicit conversion与 C# 枚举和显式转换混淆
【发布时间】:2009-08-11 14:49:20
【问题描述】:

我有以下枚举 -->

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

原谅我的无知,我只是想了解事物的原因,而不仅仅是它们如此。

【问题讨论】:

  • 枚举本质上不是一种“类型”吗? ReportProgress 需要一个 int,而不是 SyncStatus,所以你必须强制转换。我的猜测。

标签: c# enums casting


【解决方案1】:

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

(同样没有其他方式的转换。)

顺便说一下,从常量 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;
}

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

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

【讨论】:

  • 所以,无论我使用哪种类型的枚举,我都必须将它转换为我可能需要使用它的那种类型?理由是为了保护我免受自己的伤害?我说的对吗?
  • 是的。如果您想要整数,请改用带有常量的静态类。
  • :) 谢谢,我的最终目标是能够将int 用于进度条,将string 部分用于标签控件。好像我用错了工具....
  • @Pal,您可以使用上面的最后一个示例来做您想做的事情。传递您的枚举类型,当您需要整数值时将其转换为 int 以及当您希望字符串表示显式调用 ToString() (或依赖于隐式转换)。
  • @Tuzo:当我对枚举执行 ToString 时,我得到的是文本描述,而不是字符串中的数字......我不知道。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多