2010-01-23 12 views
6

Tôi có trình phân tích cú pháp C# 4.0. Nó chấp nhận 'động' làm từ khóa làm loại. chuyến đi phân tích cú pháp của tôi trên báo cáo tìm thấy trong làm việc C# 3.0 chương trình của các hình thức:Từ khóa C# 'động' ... có thực sự là một từ khóa RESERVED hay chỉ là một định danh có nghĩa là một cái gì đó đặc biệt khi được sử dụng làm kiểu?

dynamic = <exp> ; 

Vì vậy, nó năng động thực sự là một từ khóa? Hoặc nó vẫn có thể được sử dụng như một tên định danh tùy ý? (Nếu vậy, tại sao không 'int' được điều trị theo cùng một cách)?

Có thông số tham chiếu ở đâu đó cho biết liệu từ khóa động là từ khóa không? Đặc điểm kỹ thuật mới nhất của ECMA C# 4 thậm chí không đề cập đến 'động', và tốt nhất tôi có thể tìm thấy tại trang web của MS là một "đặc tả sơ bộ" cho biết từ khóa của nó nhưng tôi nghi ngờ đó chỉ là văn bản cẩu thả.

+0

Điều này có thể hữu ích. http://blogs.msdn.com/ericlippert/archive/2009/05/11/reserved-and-contextual-keywords.aspx –

+0

@Eric: nền đẹp. Tôi đã bỏ lỡ một thực tế rằng var là một từ khóa theo ngữ cảnh, oops, tôi có phân tích cú pháp để đi điều chỉnh. –

Trả lời

10

dynamic là từ khóa theo ngữ cảnh như C# 4.0. Ấn bản thứ tư của thông số ECMA C# không đề cập đến C# 4.0. (Lưu ý ngày xuất bản năm 2006.)

MSDN mô tả nó làm từ khóa.

Nó cũng có trong số table of contextual keywords này. (Cuộn xuống.)

+0

Có lẽ. Nhưng trong cùng một tài liệu MSDN là một phần trên keywords, trong đó 'động' là vắng mặt rõ ràng. –

+0

Liên kết của bạn bị hỏng. Nhưng trong trang bạn đang đề cập đến, nó nằm trong bảng thứ hai của từ khóa theo ngữ cảnh. –

+0

Aha ... đó là những gì tôi đã bỏ lỡ! Cảm ơn rất nhiều! –

1

Đó là từ khóa. (xem sửa đổi dưới đây) Tôi là một chút bối rối về những gì bạn có nghĩa là bởi "tại sao không 'int' được điều trị theo cùng một cách?"

Bạn không thể làm điều này: int int = 5;

Nhưng bạn có thể làm được điều này, mặc dù nó không phải là thực hành tốt: int @int = 5;

Các C# 4.0 spec không đề cập đến dynamic trong phần 20.1.

EDIT: biết thêm ...

Sử dụng động như một tên biến được cho phép, do đó, nó không phải là một từ khóa (nhưng nó là một từ khóa theo ngữ cảnh - xem Sean Devlin's post). Xem ảnh chụp màn hình dưới đây sử dụng .NET 4.0 beta

dynamic

Check-out Chris Burrow của blog post. Một báo thú vị từ bài:

Như bạn có thể thấy, thành viên hiển thị công khai rằng sử dụng các loại động trên thực tế, đằng sau hậu trường, sử dụng đối tượng loại khi chúng được giải phóng. Không có loại khung "động". Tuy nhiên, những "đối tượng" đó là tất cả được trang trí theo cách mà trình biên dịch (hoặc bất kỳ ai khác) có thể cho biết rằng chúng có nghĩa là phải được xử lý động.

+0

Làm thế nào để bạn biết điều này? ... Bạn đang khẳng định chương trình C# 3.0 có chứa các bài tập cho 'động' là không hợp lệ trong C# 4.0 (mà phá vỡ khả năng tương thích ngược mà thường là một no-no)? Nếu nhiệm vụ * là * hợp lệ trong C3.0, thì tại sao không int = 7; được cho phép? –

+0

Tôi nghĩ mỗi phiên bản chính của ngôn ngữ đã thêm từ khóa và khả năng tương thích ngược bị hỏng. Ví dụ. 'foreach' trong C# 2.0 và' var' trong C# 3.0. –

+0

... Có, tôi đã thấy thông số C# 4.0; thats một trong những tôi không tin tưởng như characaterization của nó thực sự "từ khóa" ness. Đặc tả C# 3.0 có phần khám phá về từ khóa; thông số C# 4.0 không và do đó khó có thể biết được chi tiết này có được giải quyết chính xác hay không. (Tôi chắc rằng trình biên dịch C# 4.0 có ý kiến, nhưng các lập trình viên C3.0 tức giận sẽ sử dụng động như một tên định danh.) –

7

Nó không phải là một "bình thường" từ khóa như if, for, vv

Đó là một ngữ cảnh từ khóa như yield, from, vv

Đặc biệt, đây biên dịch:

object dynamic = 0; // dynamic is a contextual keyword 

nhưng điều này không:

object string = 0; // string is a regular keyword 

Bạn sẽ phải "thoát" string như thế này:

object @string = 0; 

này làm cho rất nhiều ý nghĩa về khả năng tương thích ngược: nó không chắc rằng nhiều người sẽ tạo ra một loại được gọi là dynamic (điều này sẽ gây ra sự mơ hồ; IIRC loại "thực" thắng trong trường hợp này) trong khi đó là rất khả năng mã hiện tại sử dụng các biến được gọi là dynamic.

Trong một số cách, thậm chí không cần phải là từ khóa theo ngữ cảnh (và tôi không tin rằng đặc điểm kỹ thuật bao giờ đề cập đến nó một cách rõ ràng) - bạn có thể coi đó là tên của loại luôn có sẵn (như stringobject). Tôi sẽ tưởng tượng rằng string vv được tạo từ khóa từ v1 để tránh nhầm lẫn, nhưng thêm từ khóa chính hãng (không thể được sử dụng làm số nhận dạng) sẽ có chi phí tương thích cao ngay bây giờ.

+0

Tuyệt vời (Tôi thực sự tin rằng bạn bởi vì điều đó sẽ tránh được một số vấn đề tương thích ngược). Nhưng ... đâu là nguồn có thẩm quyền mà bạn đang sử dụng để có được sự kiện cụ thể này? –

+0

@Ira: Tôi đang xem một bản sao của đặc tả C# 4 mà * không * liệt kê 'động' giữa các từ khóa; không có danh sách các từ khóa theo ngữ cảnh. Tôi đang chỉnh sửa thêm một chút thông tin ... –

+0

Giải thích tuyệt vời Jon!Nhưng tôi cảm thấy sử dụng từ "Dành riêng" thay cho "Bình thường" sẽ có nhiều khả năng hơn vì có hai loại từ khóa được định nghĩa trong C# là dành riêng và theo ngữ cảnh. – RBT

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