2010-12-14 47 views
7

Sử dụng mã này:C# Struct Generic Constructor

struct Foo<T1> 
{ 
    public T1 Item1 { get; private set; } 

    public Foo(T1 item1) 
    { 
     Item1 = item1; 
    } 
} 

tôi gặp phải lỗi này:

Backing field for automatically implemented property 'Foo.Item1' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer.

Câu hỏi của tôi là, tại sao là tài sản Item1 không hoàn toàn giao sau khi các nhà xây dựng được gọi?

Chỉnh sửa: Đã thay đổi set thành private set bởi vì câu hỏi này không liên quan gì đến tính đột biến.

+10

Đừng tạo cấu trúc có thể thay đổi được. –

+0

Tại sao anh ta không nên? Điều đó thực sự làm cho mọi thứ trở nên đơn giản hơn rất nhiều, và có thể cải thiện hiệu suất khá nhiều trong một số trường hợp có vòng lặp chuyên sâu. Có gì sai với cấu trúc có thể thay đổi? (Điều đó cũng không trả lời câu hỏi của anh ấy.) – Mehrdad

+0

@Lambert http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil –

Trả lời

15

Thêm this() ở đây:

public Foo(T1 item1) : this() 
{ 
    Item1 = item1; 
} 

Đó là bởi vì bạn đang gán đến một bất động sản, và trình biên dịch không thể suy luận rằng tài sản chỉ gán một giá trị cho một biến; nó có thể làm những việc khác trước khi cá thể được khởi tạo, và điều đó không được phép vì cấu trúc có thể có dữ liệu rác. Vì vậy, bạn phải khởi tạo nó với constructor mặc định trước, sau đó làm những gì bạn muốn.

+0

@Lambert: câu hỏi là, tại sao trình biên dịch không thể thấy rõ ràng? Trình biên dịch thực hiện khá tốt công việc phân tích luồng trong các trường hợp khác. – Vlad

+0

Tôi đã không làm cho trình biên dịch, vì vậy tôi không biết. :) Nhưng nó ngăn chặn các tình huống khác mà tài sản không được tạo tự động và nơi bạn cố gắng sử dụng dữ liệu rác. Ngoài ra, tôi tin rằng đây có thể là vấn đề CLR, không phải là vấn đề trình biên dịch - JIT có thể khiếu nại nếu bạn cố truy cập thuộc tính trước khi cá thể được khởi tạo, vì nó không có thông tin mà trình biên dịch có sẵn ngay lập tức nó. – Mehrdad

+0

Bạn cũng có thể giải quyết điều này bằng cách thực hiện rõ ràng hàm tạo mặc định của riêng bạn. –

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