2012-01-10 57 views

Trả lời

54

Loại trả về không phải là một phần của chữ ký phương thức trong C#. Chỉ tên phương thức và thông số của phương thức loại (nhưng không phải tham số tên) là một phần của chữ ký. Ví dụ: bạn không thể có hai phương pháp sau:

int DoSomething(int a, int b); 
string DoSomething(int a, int b); 

Để rõ ràng: Phương thức không thể quá tải dựa trên loại trả về của chúng. Họ phải có tên duy nhất, loại thông số duy nhất hoặc chuyển đối số của chúng khác nhau (ví dụ: sử dụng out hoặc ref).

Edit: Để trả lời câu hỏi ban đầu của bạn, chữ ký phương pháp cho phương pháp của bạn là:

DoSomething(int, int) 

Lưu ý rằng tất cả điều này áp dụng đối với các phương pháp thông thường. Nếu bạn đang nói về delegate s, thì bạn sẽ thấy câu trả lời của keyboardP. (Phiên bản ngắn: loại trả về là một phần của chữ ký cho một đại biểu).

+0

@adamjmarkham: Bạn chỉ có thể thực hiện khi ghi đè trong một phân lớp chứ không phải "tùy thuộc vào phương thức". Và tôi khá chắc chắn rằng kiểu trả về là * không * một phần của chữ ký. – BoltClock

+0

loại trả về không phải là một phần của phương thức chữ ký của tôi. – DarthVader

+0

@ ean5533 .... thanx để mô tả, nó giúp tôi rất nhiều ... – Usman

13

Từ MSDN:

Chữ ký của một phương pháp bao gồm tên của phương pháp và các loại và các loại (giá trị, tài liệu tham khảo, hoặc đầu ra) của mỗi các thông số chính thức của nó, được xem xét theo thứ tự từ trái sang phải. Chữ ký của một phương pháp đặc biệt không bao gồm các kiểu trả về

Edit: Đó là từ tài liệu cũ. Có vẻ như định nghĩa của 'chữ ký' đã thay đổi kể từ đó. Bây giờ một phương pháp có hai chữ ký khác nhau, một cho mục đích của quá tải và một cho các mục đích xác định khả năng tương thích đại biểu. Xem câu trả lời của keyboardP dưới đây để biết thêm chi tiết.

+0

@downvoter, Bạn có câu trả lời hay hơn không? – gdoron

+0

@gdoron Nếu bạn chia các điểm số phiếu, bạn có thể thấy một người nào đó đã bỏ qua mọi câu trả lời trên trang. Đi con số. Chỉnh sửa: Và bây giờ họ downvoted câu hỏi quá. – ean5533

+0

@gdoron - Bất kể câu trả lời của keyboardP, tài liệu tham khảo tài liệu gần đây nhiều hơn, tốt hơn nhiều so với tôi. –

0

Chữ ký không chứa loại trả về. Cả tên thông số. Trong trường hợp của bạn nó sẽ là DoSomething(int, int)

12

Từ MSDN:

Một kiểu trả về của một phương pháp không phải là một phần của chữ ký của phương pháp cho các mục đích của phương pháp quá tải. Tuy nhiên, nó là một phần của chữ ký của phương thức khi xác định khả năng tương thích giữa một đại biểu và phương pháp mà nó trỏ đến.

Để làm rõ, trong ví dụ của bạn, loại trả về không phải là một phần của chữ ký.Tuy nhiên, khi bạn khớp chữ ký của một đại biểu, nó được coi là một phần của chữ ký. Từ MSDN:

Bất kỳ phương pháp phù hợp với chữ ký của người đại biểu, trong đó bao gồm kiểu trả về và tham số, có thể được giao cho các đại biểu. Việc này có thể thay đổi chương trình các cuộc gọi phương thức và cũng có thể cắm mã mới vào các lớp hiện có. Miễn là bạn biết chữ ký của đại biểu , bạn có thể chỉ định phương thức được ủy quyền của riêng bạn.

Vì vậy, tôi tin rằng điều đó dựa trên ngữ cảnh. Hầu hết thời gian, và như được hiển thị trong mã của bạn, kiểu trả về không phải là một phần của nó. Tuy nhiên, trong bối cảnh của phái đoàn, nó được coi là một phần của nó.

39

Loại trả lại có phải là một phần của chữ ký hay không?

Tùy thuộc vào số lý do bạn hỏi câu hỏi. Bạn quan tâm làm gì?

Có hai định nghĩa về chữ ký phương thức. Định nghĩa ngôn ngữ C# không không bao gồm loại trả về và sử dụng chữ ký của phương thức để xác định xem hai quá tải có được phép hay không. Hai phương thức có cùng chữ ký không được phép trong một loại. Vì C# không xem kiểu trả về là một phần của chữ ký, C# không cho phép hai phương thức chỉ khác nhau về kiểu trả về được khai báo trong cùng một kiểu.

CLR, tuy nhiên, không bao gồm loại trả về trong chữ ký. CLR cho phép hai phương thức có cùng loại chỉ khác nhau về kiểu trả về.

Để cụ thể hơn: trong C# chữ ký bao gồm các phương pháp:

  • tên
  • số tham số kiểu
  • số thông số chính thức
  • loại của mỗi tham số chính thức
  • out/ref/value-ness của mỗi thông số chính thức

với các ghi chú bổ sung sau đây:

  • generic loại hạn chế tham số không phải là một phần của chữ ký
  • trở lại loại không phải là một phần của chữ ký
  • kiểu tham số và tham số chính thức tên không nằm trong chữ ký
  • hai phương pháp có thể không khác biệt chỉ in/out ref

trong CLR chữ ký bao gồm:

  • tên
  • số tham số kiểu
  • số thông số chính thức
  • loại của mỗi tham số chính thức bao gồm modopts và modreqs
  • kiểu trả bao gồm modopts và modreqs
  • ref/giá trị của mỗi thông số chính thức

Lưu ý rằng CLR không phân biệt giữa "ref int" và "out int" khi xem xét chữ ký. Lưu ý rằng CLR không phân biệt giữa các loại modopt/modreq. (Cách mà trình biên dịch C# giao dịch với các loại modopt/modreq quá phức tạp để tóm tắt ở đây.)

+4

Tôi đã googling và không tìm thấy gì về lý do tại sao nhóm C# quyết định loại trả lại không phải là một phần của chữ ký? Chỉ các vấn đề hiệu suất? Bạn có thể làm sáng tỏ không? tks –

+0

Xin chào, tôi muốn hỏi cùng một câu hỏi như Luis fillipe. –

+2

@mmhasannn: Quá tải phải khác nhau về chữ ký. Nếu kiểu trả về là một phần của chữ ký thì bạn có thể có hai phương thức chỉ khác nhau về kiểu trả về. Điều đó làm phức tạp quá mức độ phân giải quá tải. –

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