Jump to content
Xtreme .Net Talk

Recommended Posts

Posted

I finally ran into something I couldn't translate easily. Maybe one of you can help.

 

EXListViewItem lstvItem = this.GetItemAt(e.X, e.Y) as EXListViewItem;

 

Never seen the "as" keyword used that way in C# before and not sure quite what to do with in in VB

"Programmers are tools for converting caffeine into code."

 

Madcow Inventions -- Software for the Sanity Challenged.

Posted

The GetItemAt method assumably returns an object (or type Object), the as keyword is used to cast the object to the left of it to the type listed on the right.

// cast the returned object to type EXListViewItem
this.GetItemAt(e.X, e.Y) as EXListViewItem
// different way of writing the same thing
(EXListViewItem)this.GetItemAt(e.X, e.Y)

In VB I believe you would use DirectCast. The code would look something like the code below, forgive me if thats not entirely right haven't got Visual Studio handy and casting isn't somthing I've handled much in VB.

Dim lstvItem As EXListViewItem = DirectCast(this.GetItemAt(e.X, e.Y), EXListViewItem)

Anybody looking for a graduate programmer (Midlands, England)?
  • Administrators
Posted

IIRC the 'as' keyword in C# will cast the variable to the correct type if it can or return null if it can't.

 

The vb equivalent would be something like

//EXListViewItem lstvItem = this.GetItemAt(e.X, e.Y) as EXListViewItem;
dim lstvItem as EXListViewItem
if typeof(Me.GetItemAt(e.x, e.y)) is EXListViewItem then
   DirectCast(Me.GetItemAt(e.x, e.y), EXListViewItem )
end if

 

although I haven't tested it (or even compiled it too be honest) it should give you the general idea

Posting Guidelines FAQ Post Formatting

 

Intellectuals solve problems; geniuses prevent them.

-- Albert Einstein

Posted

Actually, it's nothing to do with DirectCast.

 

In VB2005, the equivalent is:

Dim lstvItem As EXListViewItem = TryCast(Me.GetItemAt(e.X, e.Y), EXListViewItem)

 

In VB2003, the equivalent is:

Dim lstvItem As EXListViewItem = CType(IIf(TypeOf Me.GetItemAt(e.X, e.Y) Is EXListViewItem, Me.GetItemAt(e.X, e.Y), Nothing), EXListViewItem)

Posted
TryCast is certainly the better solution I couldn't remember the keyword as I didn't have VS handy, plus I use VS 2003. The code provided by PlausiblyDamp would work perfectly fine so to say it's nothing todo with DirectCast is merely a matter of opinion. Your VS 2003 code does pretty much the exact same thing except it uses CType. To the best of my knowledge CType does the same job as DirectCast except it won't error if the object passed in is not of the right type. Since the code checks the type anyway this is somewhat irrelevant.
Anybody looking for a graduate programmer (Midlands, England)?
  • Administrators
Posted

TryCast is a better solution but only for .Net / VS 2005.

 

However for .Net 1 / VS 2002 / 2003 users -

 

DirectCast will only work if the object is of the same type (or inherited from / implements) as the target type.

 

CType will succeed if the object can be converted to the target type.

 

In this respect they are fundamentally different. CType will always work where DirectCast would, however the reverse is not the case - DirectCast can fail where a CType would succeed. Regardless of performance etc. I would prefer to be explicit and use a conversion when I'm converting and a cast when I am casting as this makes the resultant code cleaner and easier to read.

 

Attempting to us the c# 'as' keyword will fail when converting between types without an implicit conversion operator (it works if an implicit one is present, but if that was the case the casting would be unnecessary anyway); based on this I treated it as behaving like DirectCast rather than CType as CType would have resulted in behaviour different to the C# original.

Posting Guidelines FAQ Post Formatting

 

Intellectuals solve problems; geniuses prevent them.

-- Albert Einstein

Posted
Thanks for that explaination. I wasn't aware of the finer points of those types of statements and I am sure that bit of knowledge will come in very handy later. :D

"Programmers are tools for converting caffeine into code."

 

Madcow Inventions -- Software for the Sanity Challenged.

Posted

Cags & Plausibly Damp:

You're right - for 2003, DirectCast is indeed just as good.

 

Since both our solutions check the type anyway before casting, the behavior will be identical (even though the behavior of DirectCast and CType on their own may differ).

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...