Tùy thuộc vào TypeA
và TypeB
.
- Nếu chính xác một trong số họ được áp dụng (ví dụ không có chuyển đổi từ
null
để TypeB
bởi vì nó là một loại giá trị nhưng TypeA
là một loại tài liệu tham khảo) sau đó cuộc gọi sẽ được thực hiện cho một áp dụng.
- Nếu không, nó phụ thuộc vào mối quan hệ giữa
TypeA
và TypeB
.
- Nếu có một chuyển đổi ngầm
TypeA
-TypeB
nhưng không có chuyển đổi ngầm TypeB
-TypeA
thì tình trạng quá tải sử dụng TypeA
sẽ được sử dụng.
- Nếu có chuyển đổi ẩn từ
TypeB
thành TypeA
nhưng không chuyển đổi ẩn từ TypeA
thành TypeB
thì sử dụng quá tải TypeB
sẽ được sử dụng.
- Nếu không, cuộc gọi không rõ ràng và sẽ không biên dịch được.
Xem phần 7.4.3.4 của thông số C# 3.0 để biết các quy tắc chi tiết.
Đây là một ví dụ về nó không rõ ràng. Tại đây, TypeB
có nguồn gốc từ TypeA
, có nghĩa là có chuyển đổi tiềm ẩn từ TypeB
đến TypeA
, nhưng không phải ngược lại. Do đó, tình trạng quá tải sử dụng TypeB
được sử dụng:
using System;
class TypeA {}
class TypeB : TypeA {}
class Program
{
static void Foo(TypeA x)
{
Console.WriteLine("Foo(TypeA)");
}
static void Foo(TypeB x)
{
Console.WriteLine("Foo(TypeB)");
}
static void Main()
{
Foo(null); // Prints Foo(TypeB)
}
}
Nói chung, ngay cả khi đối mặt với một cuộc gọi khác-mơ hồ, để đảm bảo rằng một tình trạng quá tải đặc biệt được sử dụng, chỉ cần cast:
Foo((TypeA) null);
hoặc
Foo((TypeB) null);
Lưu ý rằng nếu điều này liên quan đến thừa kế trong các lớp khai báo (tức là một lớp đang quá tải phương thức được khai báo bởi lớp cơ sở), bạn sẽ gặp một vấn đề khác, và bạn ed để bỏ mục tiêu của phương thức chứ không phải đối số.
Nguồn
2009-04-05 19:51:09
Một số khác phải nhận thức được quá tải phương pháp mà ít nhất một phương pháp sử dụng từ khóa params. –