2009-05-05 25 views

Trả lời

38

Eric Lippert đã làm toàn bộ bài viết trên blog về đề tài này.

Tóm lại, vấn đề chính là nó sẽ đòi hỏi một chính tái cấu trúc của C# biên dịch để làm như vậy. Các khai báo hiện đang được xử lý theo một cách đơn. Điều này đòi hỏi nhiều lần truyền vì khả năng tạo chu kỳ giữa các biến suy luận. VB.net có cùng một vấn đề.

+0

buồn cười, ông đề nghị bổ sung thêm tính năng khác với ngôn ngữ chỉ để bù đắp cho một thiếu trình biên dịch. Có nhiều cách để viết một trình biên dịch không cho phép các loại vô danh bị rò rỉ, hoặc có thể xử lý một phương thức vượt qua đầu tiên được hoãn lại. –

+5

Tôi biết rằng có nhiều cách để làm điều đó. Chúng tôi đang chọn không làm bất kỳ điều gì trong số họ vào lúc này; chi phí của họ không có giá trị lợi ích. –

+0

xin lỗi Eric, tôi đoán tất cả những gì tôi đang cố gắng nói là tôi rất vui khi chờ trình biên dịch trình biên dịch trái ngược với việc bỏ phiếu để sao chép java mới(), ngay cả khi chúng ta có thể có nó sớm hơn. Nó chỉ không cảm thấy như nó phù hợp ngay từ khi chúng tôi đã có var. –

0

Tôi nghĩ rằng đó là do phạm vi của loại được ngụ ý đó rộng hơn và do đó nhiều khả năng gây ra sự cố hơn trong phạm vi của một phương thức.

1

Vì việc này dễ thực hiện hơn nhiều. Nếu bạn suy luận tất cả các loại, người ta sẽ cần một cái gì đó giống như hệ thống suy luận kiểu Hindley Milner mà sẽ làm cho C# yêu quý của bạn thành ngôn ngữ phái sinh Haskel.

1

Về cơ bản, vấn đề bạn đang gặp phải là C# (cho đến nay) là ngôn ngữ được nhập tĩnh. Một biến cục bộ được định nghĩa là var vẫn được nhập tĩnh, nhưng được ẩn theo cú pháp. Mặt khác, phương thức trả về var có nhiều hàm ý. Nó trở thành một giao diện cho việc sử dụng, và bạn không đạt được bất cứ điều gì bằng cách sử dụng var.

6

Jared có một liên kết tuyệt vời trong câu trả lời của mình, với một chủ đề tuyệt vời.

Tôi nghĩ rằng nó không trả lời câu hỏi một cách rõ ràng.

Tại sao không?

var getFoo() { 
    return new Foo(); 
} 

Lý do cho điều này là:

gì nếu?

class Foo {} 

var GetFoo() { 
    return GetBar(); 
} 

var GetBar() { 
    return GetBaz(); 
} 

var GetBaz() { 
    return new Foo(); 
} 

Bạn có thể suy luận rằng GetFoo sẽ trở Foo, nhưng bạn sẽ phải theo dõi thông qua tất cả các cuộc gọi rằng phương pháp làm và con của nó làm chỉ để suy ra các loại. Vì nó là viết tắt của trình biên dịch C# không được thiết kế để làm việc theo cách này. Nó cần phương thức và kiểu trường sớm trong quá trình trước khi mã mà các loại có thể chạy.

Trên một mức độ hoàn toàn thẩm mỹ, tôi tìm thấy các định nghĩa var về phương pháp gây nhầm lẫn mọi thứ. Một nơi mà tôi nghĩ rằng rõ ràng là luôn luôn giúp, nó bảo vệ bạn khỏi việc tự chụp mình bằng cách vô tình quay trở lại một loại khiến chữ ký của bạn và một tấn chữ ký phụ thuộc khác thay đổi. Tệ nhất, bạn có khả năng có thể thay đổi tất cả các chữ ký của một chuỗi phương thức mà không hề biết bạn đã làm như vậy nếu bạn trả về giá trị của một phương thức trả về đối tượng và đã may mắn.

Tôi nghĩ rằng phương pháp var còn lại tốt nhất cho các ngôn ngữ động như Ruby

+11

Không, đó không phải là vấn đề. Chúng tôi đã giải quyết vấn đề đó trong C#, như bạn có thể chứng minh. Nếu bạn đặt getFoo thành lambda, chúng ta sẽ suy ra kiểu trả về của lambda là Foo. Có những vấn đề thực sự. Một vấn đề là nếu "var getFoo() {...}" gọi "var getBar() {...}" mà lần lượt gọi ... bạn sẽ phải thực hiện phân tích toàn bộ chương trình chỉ để nhập phương pháp. Kiến trúc trình biên dịch hiện tại giả định rằng các phương thức và các trường có thể được gõ trước khi các phương thức của phương thức được phân tích. –

+0

Câu trả lời được chỉnh sửa và mở rộng để phản ánh –

1

bạn có thể sử dụng trong vs 2010 động

Dynamic getFoo() { 
    return new Foo(); 
} 
+0

Trừ khi bạn nghĩa đen không thể viết loại đó (ví dụ, các loại ẩn danh), đây là một cách khủng khiếp để tránh viết ra tên loại dài. Bạn vứt bỏ tất cả các lợi ích (khá đáng kể) của ràng buộc tĩnh. –

+0

Nhưng đó là 'động', trong chữ thường –

+0

Điều này rất hữu ích! Điều này giải quyết tất cả các trường hợp hiển nhiên khi tôi cần một trường để kiểu khởi tạo của nó được suy ra bởi bộ khởi tạo, điều này rất nhiều cho tôi. Và Eric L. đã nói đúng ngay từ đầu bài báo giải thích tại sao không có var cho các lĩnh vực. Bài báo của ông tiếp tục giải thích cách các trường hợp đệ qui cực đoan là một vấn đề, nhưng tôi không thể hiểu được tại sao trường hợp phổ biến hơn không được giải quyết. Rất may "năng động" giải quyết điều này. –

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