Tôi đã tìm ra một thứ khá khó hiểu trong C# gần đây. Trong cơ sở mã của chúng tôi, chúng tôi có một lớp học TreeNode
. Khi thay đổi một số mã, tôi thấy rằng không thể gán biến cho thuộc tính Nodes
. Khi kiểm tra kỹ hơn, nó trở nên rõ ràng rằng tài sản là chỉ đọc và hành vi này được mong đợi.Thiết lập thuộc tính chỉ đọc với loại vô danh
Điều kỳ lạ là cơ sở mã của chúng tôi đã có từ trước đến nay luôn dựa vào việc gán một số loại ẩn danh cho thuộc tính Nodes
và được biên soạn và hoạt động hoàn hảo.
Để tóm tắt: tại sao bài tập ở số AddSomeNodes
hoạt động ngay từ đầu?
using System.Collections.Generic;
namespace ReadOnlyProperty
{
public class TreeNode
{
private readonly IList<TreeNode> _nodes = new List<TreeNode>();
public IList<TreeNode> Nodes
{
get { return _nodes; }
}
}
public class TreeBuilder
{
public IEnumerable<TreeNode> AddSomeNodes()
{
yield return new TreeNode
{
Nodes = { new TreeNode() }
};
}
public IEnumerable<TreeNode> AddSomeOtherNodes()
{
var someNodes = new List<TreeNode>();
yield return new TreeNode
{
Nodes = someNodes
};
}
}
}
@Downvoter Tại sao lại là downvote? Quan sát của tôi về tình hình OPs là chính xác theo tài liệu và thử nghiệm của riêng tôi. Chưa kể tất cả các câu trả lời khác. –
Tôi vừa nhận được phiếu bầu xuống! – MBen
Cảm ơn bạn đã cung cấp câu trả lời đầy đủ và ngắn gọn như vậy một cách nhanh chóng! Bạn hoàn toàn đúng rằng tôi đã nhầm lẫn khi gọi nó là một loại vô danh. Hành vi này có ý nghĩa khi xem xét nó là cú pháp khởi tạo bộ sưu tập, chứ không phải gán kiểu ẩn danh. Đôi khi rất khó để phân biệt các khái niệm này một cách tinh thần bởi vì chúng rất giống nhau. Cảm ơn! – Michiel