2012-06-05 41 views
5

Tôi có một phương thức trả về một đối tượng và cũng có tham số ngoài. Phương thức này gọi một phương thức khác có cùng tham số như một tham số khác. Điều này cho phép một lỗi xây dựng trên câu lệnh return:Làm cách nào để chỉ định tham số trong hàm?

Tham số ra 'param1' phải được giao cho trước khi lá kiểm soát phương pháp hiện tại

Mã này trông giống như:

public TypeA Method1(TypeA param1, out bool param2) 
{ 
    /... some logic here .../ 
    SubMethod(out param2); 
    /... some logic here .../ 
    return param1; 
} 

param2 được thao tác trong SubMethod(), không phải trong Method1(). Tôi có cần làm gì khác không?

+5

Mã đó không đồng ý với thông báo lỗi. Cố gắng tách nó thành * chỉ * mã với 'param1' (tôi nghĩ' param2' là một cá trích đỏ ở đây). –

+0

Vâng, đó là những gì tôi nghĩ quá. –

+2

Whats quan hệ giữa TypeA và TypeB? –

Trả lời

3

Trong trường hợp này, tôi sẽ chỉ định một giá trị 'mặc định'. Bất kể bool, int, myFoo, vv - đặt giá trị mặc định.

public TypeA Method1(TypeB param1, out bool param2) 
{ 
    param2 = false; // default value; 
    // or 
    param2 = default(bool); // in cases where you are not sure what the default is 

    /... some logic here .../ 
    SubMethod(out param2); 
    /... some logic here .../ 
    return param1; // UPDATE: <- this is where you are receiving the exception 
} 

Nhưng bạn cần phải xác định lý do tại sao ngoại trừ đề cập đến 'param1' khi param1 rõ ràng là không có lỗi trong ví dụ này (để làm rõ: giả TypeB : TypeA và bị hạn chế đúng cách).

Tôi tin rằng việc chuyển số param2 làm thông số out trong SubMethod(...) sẽ xóa nghĩa vụ chỉ định param2. Tuy nhiên, bạn chưa gán bất cứ điều gì cho param1. Có nhiều điều đang diễn ra ở đây chưa được giải thích?

+1

Tôi nghĩ rằng bạn đóng đinh nó trên đầu. Vấn đề là vì anh ta trả về TypeB khi nó yêu cầu TypeA. –

+1

Tôi nghĩ rằng chỉ cần gán ngay từ đầu là những gì tôi còn lại. Có những thứ khác đang diễn ra (điều kiện) có thể tạo ra các đường dẫn mã cho SubMethod(), mà không được thực hiện. – 4thSpace

+1

Giống như tôi đã nói trong phần bình luận cho câu hỏi, hãy cẩn thận không gán 'param2 = false;' trừ khi bạn chấp nhận rằng 'Method1' có thể trở lại với' param2' được đặt thành giá trị đó. Có 'false' có ý nghĩa như một giá trị chấp nhận được nếu' SubMethod' không bao giờ bị tấn công?Nếu trình biên dịch có thể thấy rằng mọi đường dẫn mã đi qua lệnh 'SubMethod (out param2)', nó sẽ không cần thiết để đặt 'param2' thành một số giá trị vô nghĩa đầu tiên. ('param2' chắc chắn được gán sau khi' SubMethod' trả về.) –

1

Bạn có thể đặt thành false ngay từ đầu Method1.

+1

Làm cách nào để giải thích một chút? –

0

Tôi có thể đề nghị di chuyển các tham số trong SubMethod với kiểu trả về:

public TypeA Method1(TypeB param1, out bool param2) 
{ 
    /... some logic here .../ 
    param2 = SubMethod(param2); 
    /... some logic here .../ 
    return param1; 
} 
Các vấn đề liên quan