Tôi đang vật lộn với một điều kỳ lạ, ít nhất là đối với tôi, phương pháp quá tải độ phân giải của .net. Tôi đã viết một mẫu nhỏ mô phỏng vấn đề:Cách xử lý quá tải có độ phân giải hành vi bất ngờ
class Program
{
static void Main(string[] args)
{
var test = new OverloadTest();
test.Execute(0);
test.Execute(1);
Console.ReadLine();
}
}
public class OverloadTest
{
public void Execute(object value)
{
Console.WriteLine("object overload: {0}", value);
}
public void Execute(MyEnum value)
{
Console.WriteLine("enum overload: {0}", value);
}
}
public enum MyEnum
{
First = 1, Second = 2, Third = 3
}
Sẽ in:
enum overload: 0
object overload: 1
Về cơ bản sự quá tải gọi là khác nhau tùy thuộc vào giá trị (0, 1) thay vì kiểu dữ liệu nhất định .
Ai đó có thể giải thích?
Cập nhật
tôi nên đã chỉ ra rằng có một hành vi khác nhau giữa C# 2 và C# 3
Do((long)0) => object overload //C# 2
Do((long)0) => enum overload //C# 3
Điều đó rất lạ. Tôi đã mong đợi nó sẽ không biên dịch chút nào, bởi vì hai cuộc gọi riêng biệt tới Execute là mơ hồ. 0 và 1 là int's, và vì vậy nó có giá trị như nhau để gọi quá tải đối tượng cũng như quá tải MyEnum. – Nick
tôi không biết điều đó. tại sao 0 chuyển đổi hoàn toàn thành bất kỳ loại enum nào? trong ví dụ ở đây, 0 không phải là giá trị hợp lệ. nếu một cái gì đó không có ý nghĩa với dòng suy nghĩ của tôi, điều đó không nhất thiết có nghĩa là tất cả những gì nhiều (như được chỉ ra 1 phút trước);) – hackerhasid
@statichippo: Nó tiện dụng trong một vài trường hợp, chẳng hạn như sau khi thực hiện số học bitwise trên cờ. @Nick: Cả hai phương pháp đều * áp dụng *, nhưng chuyển đổi từ 0 thành enum là "tốt hơn" chuyển đổi từ 0 thành đối tượng theo các quy tắc của C# spec ... đó là lý do tại sao quá tải đó được gọi. –