Đây là một phiên bản đơn giản của một số mã của tôi:Cycle trong cách bố trí struct không tồn tại
public struct info
{
public float a, b;
public info? c;
public info(float a, float b, info? c = null)
{
this.a = a;
this.b = b;
this.c = c;
}
}
Vấn đề là lỗi Struct member 'info' causes a cycle in the struct layout.
tôi sau struct như hành vi kiểu giá trị. Tôi có thể mô phỏng điều này bằng cách sử dụng một lớp và một chức năng thành viên bản sao, nhưng tôi không thấy lý do tại sao tôi cần phải.
Lỗi này đúng như thế nào? Sự đệ quy có lẽ có thể gây ra việc xây dựng mãi mãi trong một số tình huống tương tự, nhưng tôi không thể nghĩ ra bất kỳ cách nào có thể trong trường hợp này. Dưới đây là những ví dụ nên được tốt nếu chương trình sẽ biên dịch.
new info(1, 2);
new info(1, 2, null);
new info(1, 2, new info(3, 4));
chỉnh sửa:
Các giải pháp tôi sử dụng là làm cho "info" một lớp học thay vì một struct và cho nó một chức năng thành viên để trả lại một bản sao mà tôi sử dụng khi đi qua nó. Trong hiệu ứng mô phỏng hành vi tương tự như một cấu trúc nhưng với một lớp.
Tôi cũng đã tạo câu hỏi sau trong khi tìm kiếm câu trả lời.
Value type class definition in C#?
Đoán của tôi là bạn cần có ít nhất một hàm tạo không nhận 'thông tin' làm tham số? Bạn đang sử dụng một đối số mặc định, nhưng có lẽ C# không thích điều đó. Điều gì xảy ra nếu bạn thực hiện hai nhà thầu? –
Chỉ cần biến nó thành một lớp; đây không phải là dữ liệu struct –
'info?' không phải là con trỏ * tới 'thông tin', đó là bản sao. Nếu bạn thực sự cần điều này (bạn không nên), tại sao không làm cho loại nullable của riêng bạn mà là một 'lớp'? Bạn thậm chí có thể có các toán tử ngầm để chuyển đổi thành 'YourNullable' từ 'Nullable '. Tất nhiên, nó sẽ có nghĩa là một * boatload * của 'YourNullable's, khá có thể loại bỏ bất kỳ tiền thưởng (nếu có) từ việc có lớp của bạn là một' struct' :) C# 'struct' s không C 'struct' S. –
Luaan