2013-05-09 25 views
6

này có thể có một lời giải thích đơn giản tôi không nhìn thấy, nhưng tại sao lại là đoạn mã sau quy phạm pháp luật:const lĩnh vực năng động so với bất kỳ hành vi const trường chuẩn cũ

public struct Foo 
    { 
     const object nullObject = null; 

     public override string ToString() 
     { 
      if (nullObject == null) 
      { 
       return base.ToString(); 
      } 

     } 
    } 

Trong khi những điều sau đây,

public struct Foo 
    { 
     const dynamic nullObject = null; 

     public override string ToString() 
     { 
      if (nullObject == null) 
      { 
       return base.ToString(); 
      } 

     } 
    } 

cung cấp lỗi thời gian biên dịch sau: Foo.ToString() ': không phải tất cả các đường dẫn mã đều trả về giá trị?

Tại sao thực tế là nullObjectdynamic làm cho trình biên dịch không thể khẳng định rằng nullObject sẽ luôn là null?

EDIT: Mở rộng trên các câu hỏi, và dựa trên smoore's câu trả lời, tại sao các trình biên dịch cho phép dynamicconst trường để bắt đầu với? Không phải là nó tự đánh bại sao? Tôi biết kịch bản này không có ứng dụng thực sự nào cả và nó thẳng thắn khá vô nghĩa nhưng tôi tình cờ gặp nó bởi tai nạn tuyệt đối và chỉ tò mò thôi.

+1

'tại sao trình biên dịch cho phép các trường const động bắt đầu bằng?' Bởi vì về mặt kỹ thuật nó cho phép 'const' được áp dụng cho bất kỳ loại trường nào. Như với bất kỳ tính năng nào, câu hỏi không phải là "tại sao họ không thực hiện tính năng này mà tôi muốn?" đó là "tại sao họ nên thực hiện tính năng này mà tôi muốn?" Trong trường hợp này, đối tượng địa lý sẽ cấm một trường 'const' từ' động'. Như với hầu hết các yêu cầu tính năng, câu trả lời sẽ rất có thể là "nó không đáng để dành thời gian và công sức, có thêm nhiều tính năng quan trọng cần thêm". Điều này là khá ra khỏi con đường của bạn để bắn mình vào chân. – Servy

Trả lời

6

Bởi vì dynamic đối tượng không được giải quyết tại thời gian biên dịch, do đó trình biên dịch không có ý tưởng rằng nó sẽ luôn là rỗng. Đối tượng động sẽ không được giải quyết cho đến khi thời gian chạy.

EDIT:

tôi thấy sự nhầm lẫn của mình, tại sao thậm chí cho phép một động const?

Đoán của tôi là động có thể được thay đổi thành loại không thể vô hiệu hóa, trong trường hợp ToString sẽ không trả về giá trị, nhưng đó chỉ là phỏng đoán. Tôi cũng nghĩ rằng bạn có thể vẫn muốn có khả năng để có một hằng số động, để bạn có thể đảm bảo giá trị sẽ không thay đổi bên ngoài của constructor tĩnh, nhưng không biết loại cho đến khi thời gian chạy.

Một khả năng khác, như Servy chỉ ra, đó là một trường hợp góc như vậy không đáng để sửa chữa.

+0

Tôi hiểu rằng, nhưng sau đó, tại sao cho phép các trường 'dynamic'' const' bắt đầu bằng? Toàn bộ vấn đề là 'const' không thể tĩnh hơn. – InBetween

+0

@Tejas: Không, mã đó sẽ không biên dịch. Các trường tham chiếu const chỉ có thể được khởi tạo thành 'null' ngoại trừ' chuỗi' luôn luôn là một lớp 'đặc biệt'. Các kiểu giá trị chỉ có thể được khởi tạo thành các biểu thức liên tục để bắt đầu. – InBetween

+0

@Tejas Ngoại trừ các giá trị 'const' phải được đánh giá tại thời gian biên dịch, vì vậy chúng không thể gọi bất kỳ phương thức nào. –

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