Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我不能将整数强制转换为枚举_C#_Enums - Fatal编程技术网

C# 为什么我不能将整数强制转换为枚举

C# 为什么我不能将整数强制转换为枚举,c#,enums,C#,Enums,我正在尝试从DataGridViewRow单元格值强制转换一个整数,我已确认该值等于0 AddedTask.Status=TaskStatus行。单元格[Status]。值 下面是创建Task对象和TaskStatus枚举的代码 class Task { public string Description { get; set; } public TimeSpan Duration { get { if (Begi

我正在尝试从DataGridViewRow单元格值强制转换一个整数,我已确认该值等于0

AddedTask.Status=TaskStatus行。单元格[Status]。值

下面是创建Task对象和TaskStatus枚举的代码

class Task
{
    public string Description { get; set; }

    public TimeSpan Duration
    {
        get
        {
            if (BeginDate == DateTime.MinValue) // BeginDate has not been set
                return new TimeSpan(0, 0, 0);
            else if (EndDate == DateTime.MinValue)
                return DateTime.Now.Subtract(this.BeginDate);
            else
                return this.EndDate.Subtract(this.BeginDate);
        }
    }

    public DateTime BeginDate { get; set; }
    public DateTime EndDate { get; set; }
    public TaskStatus Status { get; set; }

    public Task()
    {
        this.Description = string.Empty;
        this.BeginDate = new DateTime();
        this.EndDate = new DateTime();
        this.Status = TaskStatus.UNINVOICED;
    }
}

public enum TaskStatus
{
    UNINVOICED,
    INVOICED,
    PAID
}

这是可行的,但如果这是我可能要退休的唯一方法

AddedTask.Status = (TaskStatus) Enum.Parse(typeof(TaskStatus), row.Cells["status"].Value.ToString());

我进行了一点测试,发现如果原始值是Int32,则转换成功,但如果是Int64或字节,则转换失败

我的建议解决方案是在强制转换之前使用Convert.ToInt32:

AddedTask.Status = (TaskStatus) Convert.ToInt32(row.Cells["status"].Value);
发件人:

枚举是一组命名常量,其基础类型为任何整数类型。如果没有显式声明基础类型,则使用Int32


因此,您的TaskStatus枚举是从Int32派生的,任何其他整数类型的直接强制转换都将失败。

作为一种更通用的方法,您可以创建自定义方法,将所有数值类型转换为所需的任何枚举类型:

static TEnum GetEnum<TEnum>(object obj)
    where TEnum : struct, IConvertible
{
    if (!typeof(TEnum).IsEnum)
        throw new ArgumentException("TEnum must be an enumerated type");                

    return (TEnum)(IConvertible)(Convert.ToInt32(obj));
}
其用法的简单示例:

    enum Planet { Sun = 0, Moon = 1 }
    enum Abc { Abc5 = 0, Abc30 = 1 }

    private static void Main(string[] args)
    {
        var x = GetEnum<Planet>((long) 0);
        var y = GetEnum<Abc>((double)1);
        Console.Write(x);
        Console.Write(",  " + y);
    }

输出:Sun,Abc30作为旁注。使用枚举时,应该使用该枚举的字符串,通过服务进行持久化或公开时

var value = TaskStatus.UNINVOICED;
var x = value.ToString();

var reversed = (TaskStatus)Enum.Parse(typeof(TaskStatus), x);
您希望持久化的原因是,您可以在将来修改枚举。如果在第1天,您的枚举如下所示:

public enum TaskStatus
{
    UNINVOICED,
    INVOICED,
    PAID
}
public enum TaskStatus
{
    NOTSET,
    UNINVOICED,
    INVOICED,
    SOMEOTHERSTATUSBETWEENINVOICEDANDPAID,
    PAID
}
未开票的int值可能为0,开票的int值可能为1,已付款的int值可能为2

然后,如果需要将枚举更新为以下内容:

public enum TaskStatus
{
    UNINVOICED,
    INVOICED,
    PAID
}
public enum TaskStatus
{
    NOTSET,
    UNINVOICED,
    INVOICED,
    SOMEOTHERSTATUSBETWEENINVOICEDANDPAID,
    PAID
}
然后,所有持久化的数据都将被重新定义,如果由int完成的话。曾经未发出声音的数据现在将转换为NOTSET,曾经支付的数据现在将被开具发票

如果通过服务接口公开,则根据技术的不同,它将以不同的方式分配枚举元素的int值

也就是说,通过Web引用公开的枚举将不会具有与通过服务引用公开的枚举相同的int值


始终将枚举持久化为字符串,并始终按枚举或字符串传递/转换它。

您可以检查.Cells[status].Value.GetType.FullName返回的行吗?它返回System.Int64@Kookizt。这意味着您必须在强制转换为枚举之前将其取消装箱到long。也就是说,RenéVogt的答案是优雅和安全的。我将看看是否可以在SQLite数据库中指定32位整数而不是64位整数。Thanke.DataGridViewColumn.ValueType=TypeOfIt不幸地没有强制转换数据类型,因此我仍然需要使用Convert.ToInt32。能否创建一个Int64的枚举?即。public enum TaskStatus:long?@ChrisDunaway我是afk,只需尝试一下: