I have inheritance structure: Foo implements IGraphNode inherits IGraphItem.
Foo, IGraphItem/IGraphNode, and the implementation for IGraphItem/IGraphNode all reside in separate assemblies. I am using an inversion of control container, so the project I’m working in has a reference to the first two (Foo and IGraphItem/IGraphNode), but not the implementation of IGraphItem/IGraphNode. I also have Option Strict on as it is required for this project (turning if off didn’t fix the problem). I’m using .NET 3.5.
I am passing a IGraphItem around and I have code that looks like this:
Public Sub ProcessItem(of IGraphItem)(item As IGraphItem)
If TypeOf item Is Foo Then
Dim f1 = CType(item, Foo) 'Compiler error
Dim f2 = DirectCast(item, Foo) 'Compiler error
'This is what I'm currently having to do. It works.
Dim f = CType(CType(item, IGraphNode), Foo)
'Do stuff
End If
End Sub
Any idea why I’m having to do this? I should add that TryCast works, but since we’ve just confirmed that item‘s type is Foo, I don’t see why I can’t DirectCast it. Shouldn’t it just let me and throw an exception if I’m wrong? Is there a better way to accomplish what I’m trying to do?
Your original code compiles without a problem, even when target framework is 3.5.
The problem with your current code is that you’ve defined a generic method whereas
IGraphItemis not the type of your interface but the generic typeTwhich can be any type. But it cannot be another type thanTand you’re trying to cast it to typeFoo.If you would change your method signature to anything else it would work, for instance:
I assume that you’re somehow “shadowing” the type
IGraphItemof your interface with the generic typeIGraphItemin this method.It would also work if you would explicitely tell the compiler that
item As IGraphItemactually is aitem As YourNamespace.IGraphItem.I’m sure Jon or Eric could explain it better, but maybe it’s helpful anyway 😉