为什么这种强制转换在 C# 中是多余的?[复制]

Why is this cast redundant in C#? [duplicate]

提问人:Kamil Guliyev 提问时间:4/8/2023 最后编辑:CharliefaceKamil Guliyev 更新时间:4/11/2023 访问量:125

问:

这是枚举:OrderStatus

public enum OrderStatus
    {
        [Display(Name = "Gözləmədə")]
        Pending,
        [Display(Name = "Qəbul olundu")]
        Accepted,
        [Display(Name = "Ləğv edildi")]
        Rejected,
        [Display(Name = "Çatdırıldı")]
        Delivered
    }

这是模型:Order

public class Order : BaseEntity
    {
        public string AppUserId { get; set; }
        public AppUser AppUser { get; set; }
        [StringLength(255), Required]
        public string StoreName { get; set; }
        [StringLength(255), Required]
        public string StoreAddress { get; set; }
        public double TotalPrice { get; set; }
        public double RemainingBalance { get; set; }
        public ShippingMethod ShippingMethod { get; set; }
        public OrderStatus Status { get; set; }
        public PaymentStatus PaymentStatus { get; set; }
        public IEnumerable<OrderItem> OrderItems { get; set; }
        public IEnumerable<Payment> Payments { get; set; }
    }

并且 to filter data 中有一个语句:switchOrderController

private async Task<IEnumerable<Order>> PaginateAsync(string status, int page)
        {
            ViewBag.Status = status;
            ViewBag.CurrentPage = page;
            int perPage = 10;
            ViewBag.PerPage = perPage;

            IEnumerable<Order> orders = await _context.Orders
                .Include(o => o.AppUser)
                .Include(o => o.OrderItems)
                .Where(o => !o.IsDeleted)
                .OrderByDescending(o => o.Id)
                .ToListAsync();

            orders = status switch
            {
                "pending" => orders.Where(o => (int)o.Status == 0),
                "accepted" => orders.Where(o => (int)o.Status == 1),
                "rejected" => orders.Where(o => (int)o.Status == 2),
                "delivered" => orders.Where(o => (int)o.Status == 3),
                _ => orders
            };

            ViewBag.PageCount = Math.Ceiling((double)orders.Count() / perPage);

            return orders.Skip((page - 1) * perPage).Take(perPage);
        }

我的问题是:为什么强制转换为整数是多余的?我需要转换值以在 、 和 案例中比较它们,而不是案例。为什么不必要以防万一?intacceptedrejecteddeliveredpendingpending

enter image description here

实际上,这只是问题,不是问题。

C# 枚举强制 转换 整数 switch-statement

评论

0赞 Tushar Gupta 4/8/2023
Orders 对象是什么样子的?你能粘贴一个样本吗?
0赞 Rand Random 4/8/2023
enum 将被隐式转换为 int,如果与 int 相比,则不需要显式强制转换
0赞 Guru Stron 4/8/2023
@RandRandom你确定?SharpLab不同意
1赞 Rand Random 4/8/2023
@GuruStron - 为您解决了这个问题 sharplab.io/...
2赞 Guru Stron 4/8/2023
1)请不要将代码作为图像发布(以便用户可以复制粘贴它) 2)似乎是IDE错误

答:

5赞 Guru Stron 4/8/2023 #1

为什么强制转换为整数是多余的

正如您所注意到的,并非所有强制转换都是多余的,而只是一个特定的强制转换 - 来自 .0

在规范“隐式枚举转换”部分中找到:

隐式枚举转换允许将具有任何整数类型且值为零的 (§11.23) 转换为基础类型为 .在后一种情况下,通过转换为基础并包装结果来评估转换。constant_expressionenum_typenullable_value_typeenum_typeenum_type

因此,存在从常量到枚举的隐式转换,因此不需要显式转换。因此:0

const byte bZero = 0; 
MyEnum me = bZero; // Compiles
MyEnum me1 = 0; // Compiles
// MyEnum me2 = 1; // Does not compile

enum MyEnum
{
    None = 10,
    One,
    Two
}

Demo@sharplab

附言

感谢 @Rand Random 的指点。