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
Why does the CType
work and the DirectCast
does not with the same syntax? Yet if I cast the selectedValue
to an int
before I DirectCast
, then it works
Regards
_Eric
CType and DirectCast take an expression to be converted as the first argument, and the type to convert it to as the second argument. CType Function returns the result of explicitly converting an expression to a specific data type, object, structure, class, or interface. CType(expression, typename)
You use the DirectCast keyword similar to the way you use the CType Function and the TryCast Operator keyword. You supply an expression as the first argument and a type to convert it to as the second argument. DirectCast requires an inheritance or implementation relationship between the data types of the two arguments.
CType is compiled inline, which means that the conversion code is part of the code that evaluates the expression. In some cases, the code runs faster because no procedures are called to perform the conversion.
The New keyword is also used in type parameter lists to specify that the supplied type must expose an accessible parameterless constructor. For more information about type parameters and constraints, see Type List. To create a constructor procedure for a class, set the name of a Sub procedure to the New keyword.
The reason why is because CType
and DirectCast
are fundamentally different operations.
DirectCast
is a casting mechanism in VB.Net which allows for only CLR defined conversions. It is even more restrictive than the C# version of casting because it doesn't consider user defined conversions.
CType
is a lexical casting mechanism. It considers CLR rules, user defined conversions and VB.Net defined conversions. In short it will do anything and everything possible to create a valid conversion for an object to a specified type.
In this particular case you are trying to convert a value to an Enum which does not have a CLR defined conversion and hence it's failing. The VB.Net runtime however was able to find a lexical conversion to satisfy the problem.
A decent discussion on the differences exists here:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With