Tại sao hai mẫu mã sau tạo ra đầu ra khác nhau?Quá tải một phương thức trong phân lớp (Enum vs int)
Trường hợp 1
enum EnumType
{
First,
Second,
Third
}
class ClassB
{
public string Func(int index)
{
return "Func(int)";
}
public string Func(EnumType type)
{
return "Func(EnumType)";
}
}
class Program
{
static void Main(string[] args)
{
ClassB b = new ClassB();
Console.WriteLine(b.Func(0));
Console.WriteLine(b.Func(EnumType.First));
Console.ReadLine();
}
}
Output:
Func(int)
Func(EnumType)
Trường hợp 2
enum EnumType
{
First,
Second,
Third
}
class ClassA
{
public string Func(int index)
{
return "Func(int)";
}
}
class ClassB : ClassA
{
public string Func(EnumType enumType)
{
return "Func(EnumType)";
}
}
class Program
{
static void Main(string[] args)
{
ClassB b = new ClassB();
Console.WriteLine(b.Func(0));
Console.WriteLine(b.Func(EnumType.First));
Console.ReadLine();
}
}
Output:
012.351.Func(EnumType)
Func(EnumType)
Tôi đang bối rối. Nó có nghĩa là Func (EnumType) ẩn Func (int) được khai báo trong cơ sở? Nếu đây là trường hợp thì tại sao chữ 0 là ngầm được được truyền tới EnumType trong trường hợp thứ hai mà không có cảnh báo?
EDIT:
Thậm chí còn có hành vi thú vị hơn khi tôi cố gắng
Console.WriteLine(b.Func(0));
Console.WriteLine(b.Func(1));
Console.WriteLine(b.Func(EnumType.First));
đoán của bạn là gì đầu ra nên xem xét như thế nào?
ở đây là:
Func(EnumType)
Func(int)
Func(EnumType)
Bất cứ ý tưởng tại sao 0 và 1 được điều trị khác nhau?
EDIT 2:
Nó chỉ ra rằng đen 0 thực sự có ý nghĩa đặc biệt trong C#.
Here và here Tôi đã tìm thấy mô tả tuyệt vời về hành vi này (xem câu trả lời được chấp nhận).
tại sao không có cảnh báo về sự chuyển đổi tiềm ẩn từ int (0) sang EnumType? – alexm
Bạn có thể muốn đọc thêm một số chi tiết về các hội tụ ngầm http://msdn.microsoft.com/en-us/library/aa691280(v=vs.71) –
@atander: vẫn còn sự khác biệt "huyền diệu" giữa 0 và 1 (xem câu hỏi đã chỉnh sửa của tôi). Có tài liệu ở đâu đó không? – alexm