2008-10-21 22 views
5

Tôi không thể tìm thấy câu trả lời dứt khoát. Kể từ C# 2.0, bạn đã có thể tuyên bốLịch sử VB.NET Cú pháp không thể nén

int? i = 125; 

như viết tắt cho

Nullable<int> i = Nullable<int>(123); 

Tôi nhớ đọc ở đâu đó rằng VB.NET không cho phép shortcut này. Nhưng thấp và nhìn, tôi đã thử nó trong VS 2008 ngày hôm nay và nó hoạt động.

Có ai biết liệu đó có phải là cách này từ .NET 2.0 hoặc được bổ sung sau này không?

Trả lời

13

System.Nullable được giới thiệu trong .Net 2.0 và có sẵn cho VB làm loại chung. Bạn chỉ không thể sử dụng cú pháp nullable. Vì vậy, trong VS 2005 bạn có thể làm:

Dim x as Nullable(of Integer) 

Tôi không biết nếu tính tương đương giá trị và quyền Anh làm việc cho nullables trong VB 2005, nhưng tôi sẽ nghi ngờ rằng câu trả lời là có kể từ khi đội Net làm một sự thay đổi 2.0 CLR để hoàn thành boxing với nullables. Tôi sẽ tưởng tượng VB tận dụng điều này.

Năm 2008, bạn có thể rõ ràng là chỉ cần làm:

Dim x as Integer? 
+0

Sự tương đương và đấm bốc không có tác dụng trong VB 2005. Những thay đổi trong năm 2008 tập trung vào việc thêm "?" cú pháp và thực thi nâng cấp toán tử. Một điều cần lưu ý, mặc dù, là hỗ trợ cho "?" cú pháp không được thêm vào VS Code Model/Code DOM, vì vậy bất kỳ mã được thiết kế nào được tạo ra có sử dụng các kiểu nullable sẽ luôn sử dụng cú pháp chung cũ. –

0

Tôi không biết lịch sử, nhưng có, đó là tăng cường VS 2008.

+0

Tại sao trên trái đất đây là câu trả lời được chấp nhận? –

3

nó hoạt động trong VB 2005 (DotNet 2.0) nhưng nó xấu xí.

Bạn không thể sử dụng nó như biến thông thường, tôi nghĩ rằng nó có thể hoạt động như một loại đối tượng nhưng không.

Thay vì điều này:

dim oInt as object 

dim i as integer 

if oInt is nothing then 

    msgbox("int is null") 
else 

    i = cint(oInt) 

end if 

bạn có điều này.

Dim oInt as nullable(of integer) 

dim i as integer 

if oInt.HasValue = false then 

    msgbox("int is null") 

else 

    i = oInt.Value 

end if 

Vấn đề ở đây là nếu biến của bạn là rỗng và bạn xảy ra, hãy gọi thuộc tính Giá trị sẽ chặn một ngoại lệ chưa được giải quyết. Ví dụ:

ví dụ, cái yêu thích của tôi là cái này.

AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, iif(oInt.HasValue, oInt.Value, DBNull.value)) 

Sẽ dẫn đến lỗi thời gian chạy khi giá trị Nullable giả định của bạn là null !!!

vì vậy đây là nullable (số nguyên) vs mã đối tượng

nullable (số nguyên)

if oInt.HasValue then 
    AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt.Value) 
else 
    AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, dbnull.value) 
end if 

Object

AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt) 
+1

Cách đơn giản hơn để thêm thông số sẽ là sử dụng toán tử 'mới' nếu ': AddParamToSQLCmd (sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, If (oInt.HasValue, oInt.Value, DBNull.value)) Lý do mà các tác phẩm trên là nếu là một toán tử mạch vòng trong khi cả hai bên của một cuộc gọi phương thức IIf được đánh giá, bất kể toán hạng đầu tiên được đánh giá là đúng. –

1

IIRC, loại nullable đã được giới thiệu trong .NET 2.0 tại một giai đoạn rất muộn. Nhóm trình biên dịch C# quản lý để nhồi nhét thêm hỗ trợ ngôn ngữ cho họ so với nhóm VB.NET đã làm. Đội VB.NET ít nhiều bị cuốn vào VS2008. Đó là lý do tại sao bạn có thể sử dụng toán tử == để so sánh các giá trị null trong C# 2.0 trong khi trong VB.NET bạn phải đưa ra phương thức Nullable.Equals(). Grrr.

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