提问人:Kamil Guliyev 提问时间:4/8/2023 最后编辑:CharliefaceKamil Guliyev 更新时间:4/11/2023 访问量:125
为什么这种强制转换在 C# 中是多余的?[复制]
Why is this cast redundant in C#? [duplicate]
问:
这是枚举: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 中有一个语句:switch
OrderController
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);
}
我的问题是:为什么强制转换为整数是多余的?我需要转换值以在 、 和 案例中比较它们,而不是案例。为什么不必要以防万一?int
accepted
rejected
delivered
pending
pending
实际上,这只是问题,不是问题。
答:
5赞
Guru Stron
4/8/2023
#1
为什么强制转换为整数是多余的
正如您所注意到的,并非所有强制转换都是多余的,而只是一个特定的强制转换 - 来自 .0
在规范“隐式枚举转换”部分中找到:
隐式枚举转换允许将具有任何整数类型且值为零的 (§11.23) 转换为基础类型为 .在后一种情况下,通过转换为基础并包装结果来评估转换。
constant_expression
enum_type
nullable_value_type
enum_type
enum_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
}
附言
感谢 @Rand Random 的指点。
上一个:了解 memset c
下一个:投射以显示合适的结果
评论