Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Directcast & Ctype differences with enums

 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

like image 232
Eric Avatar asked Oct 13 '09 18:10

Eric


People also ask

What is DirectCast and CType?

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)

What is DirectCast in VB net?

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.

What is C type in VB net?

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.

What is the use of new keyword in VB net?

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.


1 Answers

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:

  • http://msdn.microsoft.com/en-us/library/aa289509(VS.71).aspx#vbtchmicrosoftvisualbasicnetinternalsanchor10
like image 98
JaredPar Avatar answered Sep 24 '22 12:09

JaredPar