2012-09-20 38 views
5

Tôi đã gặp phải vài lần trong tuần trước và tôi tò mò muốn biết lý do - tôi có một google, nhưng không thể tìm thấy bất kỳ điều gì có liên quan trực tiếp.Phương thức quá tải tĩnh + Lỗi động

Tôi có một lớp học với một phương pháp năng động, và tôi có thể thêm một phương pháp tĩnh với cùng một giao diện:

public class MyClass 
{ 
    public int MyMethod() 
    { 
     //do something #1; 
    } 

    public static int MyMethod() 
    { 
     //do something 
    } 
} 

này là tốt, nhưng nếu tôi cố gắng gọi phương thức tĩnh từ phương pháp năng động, thay thế # 1 bằng return MyClass.MyMethod(), tôi gặp lỗi "Cuộc gọi không rõ ràng giữa các phương thức hoặc thuộc tính sau: MyClass.MyMethod() và MyClass.MyMethod().
Nếu phương pháp tĩnh bị xóa, lỗi sẽ thay đổi thành" Một đối tượng tham chiếu là bắt buộc .. ", có ý nghĩa.

Vậy tại sao ambigu này ous? Nó đã được bắt đầu với tên lớp để chỉ định phương thức tĩnh, hoạt động từ bất kỳ nơi nào khác trong mã.
Tại sao không có ở đây?

EDIT: Tôi đã không thực sự cố gắng biên dịch nó mà không có phương pháp động gọi là tĩnh, tôi đã chỉ đi bởi VS không gạch dưới nó.
Nhưng vẫn còn là một câu hỏi tương tự Tôi cho rằng nhưng với một thêm "Tại sao không thể có được cả hai, như một là tĩnh, và người ta không"

+0

Mã được cung cấp có biên dịch cho bạn không? Nó ném lỗi CS0111 cho tôi (đã định nghĩa một thành viên được gọi là 'MyMethod' với các kiểu tham số tương tự). – prashanth

+1

Đó là một thông báo lỗi sai (không chính xác), nhưng có lẽ chỉ vì thứ tự mà trình biên dịch cố gắng giải quyết và xác minh tham chiếu. – McGarnagle

+0

@prashanth Bạn đúng. Tôi đã thực hiện một giả định - xem chỉnh sửa. – 3Pi

Trả lời

1

Bên cạnh đây là similar question on SO, đưa ra một số giải thích, tại sao bạn không thể có hai phương pháp có cùng chữ ký.

public class MyClass 
{ 
    public int MyMethod() 
    { 
     return 0; 
    } 

    public static int MyMethod() //Here compiler says, that you've already got method MyMethod with same parameter list 
    { 
     return 0; 
    } 
} 

Vì vậy, bạn không thể có những phương pháp nào cả

Có một cái nhìn tại this

Lúc đầu:

The signature of a method consists of the name of the method and the type and kind (value, reference, or output) of each of its formal parameters, considered in the order left to right. The signature of a method specifically does not include the return type, nor does it include the params modifier that may be specified for the right-most parameter.

Thứ hai:

Overloading of methods permits a class, struct, or interface to declare multiple methods with the same name, provided their signatures are unique within that class, struct, or interface.

EDIT

Vì lý do tại sao bạn gặp lỗi đó: có thể bạn chưa biên dịch và thấy lỗi được gạch chân bằng màu đỏ. Nếu bạn biên dịch, bạn sẽ thấy lỗi được gạch dưới bằng màu xanh không nằm trong dòng mà bạn gọi phương thức tĩnh của bạn, nhưng trên dòng nơi phương thức tĩnh được xác định.

+0

Câu trả lời trong câu hỏi bạn liên kết là lý do tôi đang tìm kiếm, cảm ơn bạn. – 3Pi

+1

@ 3Pi Một liên kết khác, trong đó Jon Skeet giải thích hành vi này: http://bytes.com/topic/c-sharp/answers/618378-static-non-static-methods-same-name-signature – horgh

0

So why is this ambiguous? It has been prefaced with the class name to specify the static method, which works from anywhere else in code. Why not here?

Lý do nó là mơ hồ là bởi vì bạn có thể có một thể hiện tài sản trên MyClass được gọi là MyClass. Tôi tin rằng Eric Lippert mô tả lý luận chi tiết hơn. Tôi không thể tìm thấy bài đăng cụ thể đó, nhưng here is a similar series from him.

Các vấn đề liên quan