2010-05-28 21 views
11

Tôi có một phương pháp mà trả về một IEnumerable<> mà nó được xây dựng bằng cách sử dụng các yield return cú pháp:Vấn đề với debug đồng hồ trong Visual Studio với các phương pháp điều tra viên yield return

namespace Validation 
{ 
    public class UserValidator 
    { 
     public IEnumerable<ValidationError> Validate(User user) 
     { 
      if (String.IsNullOrEmpty(user.Name)) 
      { 
       yield return new ValidationError("Name", ValidationErrorType.Required); 
      } 

      [...] 

      yield break; 
     } 
    } 
} 

Nếu tôi đặt một breakpoint trong phương pháp này, tôi có thể bước qua mỗi dòng, nhưng nếu tôi cố gắng sử dụng đeo tay hoặc cửa sổ trước mắt để xem các giá trị của một biến tôi nhận được lỗi này:

Cannot access a non-static member of outer type 'Validation.UserValidator.Validate' via nested type 'Validation.UserValidator'

có ai biết tại sao điều này là gì và làm thế nào tôi có thể nhận được xung quanh nó?

Trả lời

7

OK, chỉ cần dùng thử và tôi hiểu ý của bạn là gì. Đó là đau đớn! Tôi nghi ngờ nó có liên quan đến công việc hậu trường mà trình biên dịch thực hiện (tạo các lớp lồng nhau và như vậy) để thực hiện logic loại máy trạng thái có thể phục hồi cho yield. Một cách để vượt qua nó (cách tôi đã thử mã của bạn) là làm cho phương thức tĩnh là Validate, mặc dù rõ ràng đó không phải là điều tuyệt vời cho thiết kế.

Tôi nghĩ lý do được thông báo lỗi là lại khờ là một số sự kết hợp của:

  1. Các lớp được tạo ra không tồn tại trong nguồn của bạn, vì vậy VS không có tên mà theo đó để tham khảo đối với họ.
  2. IIRC, tên được tạo bởi trình biên dịch chứa các ký tự không hợp lệ trong số nhận dạng C#, nhưng hợp lệ trong hệ thống kiểu khung cơ bản.

Tôi không có Reflector ngay bây giờ, vì vậy không thể xác nhận, nhưng nếu bạn cảm thấy như một điểm của ánh sáng masochism, phản ánh về lắp ráp của bạn và hãy xem mã trình biên dịch viết Hãy để chúng tôi chỉ những con người sử dụng đường cú pháp đẹp như yield return :) Có rất nhiều thông tin có sẵn trên trang web về cách chính xác tất cả hoạt động.

Edit: sau một chút tìm kiếm hơn, một vài những cái tốt hơn:
http://blogs.msdn.com/b/ericlippert/archive/tags/iterators/
http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx

+0

Cảm ơn bạn đã gửi câu trả lời. Tôi đoán sau đó câu trả lời cho "làm thế nào tôi có thể nhận được xung quanh nó" một phần của câu hỏi của tôi là "bạn không thể không thay đổi thiết kế của bạn"? – stusherwin

+0

Sợ như vậy, ít nhất là xa như tôi có thể nhìn thấy. – shambulator

3

Tôi đã có vấn đề tương tự, và những gì tôi đã làm là thay đổi việc thực hiện xây dựng lập danh sách các phần tử và sau đó trả về danh sách.

Điều đó đã cho phép tôi tìm lỗi, sửa lỗi. Sau khi lỗi đã được sửa chữa, tôi thay đổi việc thực hiện trở lại một lợi nhuận lợi nhuận.

Đau đớn.

4

Phương pháp này không chạy cho đến khi bạn liệt kê nó.

var p = UserValidator.Validate(user).ToList(); 

Bây giờ bạn có thể gỡ lỗi mã của mình.

+0

Tôi nghĩ bạn có thể đã hiểu sai câu hỏi :) – stusherwin

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