2009-10-13 17 views
13
Public Enum Fruit 
    Red_Apple = 1 
    Oranges 
    Ripe_Banana 
End Enum 
Private Sub InitCombosRegular() 
    Dim d1 As New Dictionary(Of Int16, String) 
    For Each e In [Enum].GetValues(GetType(Fruit)) 
     d1.Add(CShort(e), Replace(e.ToString, "_", " ")) 
    Next 
    ComboBox1.DataSource = d1.ToList 
    ComboBox1.DisplayMember = "Value" 
    ComboBox1.ValueMember = "Key" 
    ComboBox1.SelectedIndex = 0 
End Sub 

    'This fails 
     Dim combo1 = DirectCast(ComboBox1.SelectedValue, Fruit) ' Fails 
     'these both work 
     Dim combo2 = DirectCast(CInt(ComboBox1.SelectedValue), Fruit) 'works 
     Dim combo3 = CType(ComboBox1.SelectedValue, Fruit) 'works 

Tại sao công việc CTypeDirectCast không có cùng cú pháp? Tuy nhiên, nếu tôi cast selectedValue một int trước khi tôi DirectCast, sau đó nó hoạt độngSự khác biệt về Directcast & Ctype với enums

Trân

_Eric

Trả lời

19

Lý do tại sao là bởi vì CTypeDirectCast là hoạt động cơ bản khác nhau.

DirectCast là cơ chế truyền trong VB.Net, cho phép chỉ chuyển đổi CLR được xác định. Nó thậm chí còn hạn chế hơn phiên bản đúc C# vì nó không xem xét chuyển đổi do người dùng xác định.

CType là cơ chế đúc từ vựng. Nó xem xét các quy tắc CLR, chuyển đổi do người dùng xác định và các chuyển đổi được xác định VB.Net. Trong ngắn hạn nó sẽ làm bất cứ điều gì và tất cả mọi thứ có thể để tạo ra một chuyển đổi hợp lệ cho một đối tượng với một loại quy định.

Trong trường hợp cụ thể này, bạn đang cố gắng chuyển đổi một giá trị thành một Enum không có chuyển đổi được xác định CLR và do đó nó không thành công. Thời gian chạy VB.Net tuy nhiên đã có thể tìm thấy một chuyển đổi từ vựng để đáp ứng các vấn đề.

Một cuộc thảo luận đàng hoàng về sự khác biệt tồn tại ở đây:

+1

Cảm ơn. Điều gì sẽ là thực hành tốt nhất về điều này? Rõ ràng đúc các lựa chọnValue đến một int và directcast (# 2), hoặc chỉ là Ctype (# 3) – Eric

+0

Tôi thích CType bất cứ khi nào tôi đang đối phó với các giá trị enum – JaredPar

+0

@Eric: một DirectCast nên được sử dụng khi một đối tượng là của một loại nhất định và bạn đang truyền nó đến loại đó. Một chuỗi không phải là một Enum, và không phải là một số nguyên. Nếu bạn muốn truyền tới một số nguyên đầu tiên, điều đó có thể làm cho mã của bạn rõ ràng hơn, nhưng việc sử dụng DirectCast sẽ chỉ gây nhầm lẫn cho mọi thứ. – jmoreno

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