2011-11-10 25 views

Trả lời

3

Tôi nghĩ rằng điều này xảy ra bởi vì khi bạn sử dụng d += "???"; d được chuyển thành chuỗi (sử dụng phương pháp ToString() mà lấy tên đối tượng mặc định) và sau đó "???" được thêm vào và viết cho bảng điều khiển.
Nếu bạn cố gắng sử dụng d += 2 điều này không thành công vì không có cách nào mặc định để chuyển đổi Hành động thành số nguyên. Tương tự cho các loại khác ...

+0

nếu tôi sử dụng một số loại khác cho 'a' nó sẽ đưa ra một ngoại lệ –

+0

@OrlandoWilliam: vâng, chắc chắn. Lý do là (tôi đã cố gắng giải thích trong câu trả lời của mình, có lẽ tôi không rõ ràng, xin lỗi) rằng không có _ "chuyển đổi" mặc định _ giữa Hành động và các loại khác nhưng chuỗi ... – Marco

+0

@OrlandoWilliam: Không. Bất kỳ đối tượng có thể được chuyển đổi thành một chuỗi theo cách này. Thử: 'object a = 2; a + = "???"; Ví dụ: Console.WriteLine (a); '. – StriplingWarrior

2

Thêm string vào bất kỳ thứ gì trong .NET sẽ khiến phương thức đó được gọi là phương thức .ToString và xử lý phần bổ sung dưới dạng nối chuỗi. Điều tương tự cũng sẽ xảy ra nếu bạn không sử dụng số dynamic.

Action a = new Action(() => Console.WriteLine()); 
Console.WriteLine(a + "???"); // outputs "System.Action???" 

Bất kỳ Action sẽ trở lại System.Action khi phương pháp .ToString của nó được gọi.

Sự khác biệt duy nhất giữa += trong ví dụ ban đầu và + trong ví dụ này là bạn đang đặt kết quả của phép nối vào biến động. Nó sẽ là tương đương với:

object a = new Action(() => Console.WriteLine()); 
a = a + "???"; // The same as: a = a.ToString() + "???"; 
Console.WriteLine(a); 
+0

trình biên dịch sẽ không cho phép nó nếu tôi không sử dụng động –

+0

@OrlandoWilliam: Chắc chắn nó sẽ xảy ra nếu bạn chọn 'd' làm đối tượng thay thế. Xem cập nhật của tôi. – StriplingWarrior

+0

bạn đúng, tôi đã thay đổi một số thứ khác kiểm tra những thứ khác đó là lý do tại sao nó ném ngoại lệ –

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