So I have been doing some work that involves C# and VB libraries and apps using each other, and have noticed a lot of subtle differences between the two languages.
Declaration of types inside an interface:
Public Interface ITesting
ReadOnly Property Test() As TestData
Class TestData
Public Sub New()
StringProperty = "testing"
IntProperty = 1234
End Sub
Public Property StringProperty() As String
Public Property IntProperty() As Integer
End Class
End Interface
However in C#, you cannot declare types inside an interface, however it is quite happy to consume one create in a VB project:
var test = new VbLib.ITesting.TestData();
That is not to say it is a good thing to do - I have encountered problems with XML Deserialization not working if it needed to deserialize an enum that was declared inside an interface.
Indexed Properties
Again, this is perfectly legal in VB:
Public Class CustomCollection
Inherits List(Of CustomObject)
Default Public Shadows ReadOnly Property Item(ByVal index As Integer) As CustomObject
Get
Return MyBase.Item(index)
End Get
End Property
Public ReadOnly Property IndexedReadOnly(ByVal index As Integer) As CustomObject
Get
Return Me(index)
End Get
End Property
Public Property IndexedReadWrite(ByVal index As Integer) As CustomObject
Get
Return Me(index)
End Get
Set(ByVal value As CustomObject)
MyBase.Item(index) = value
End Set
End Property
Public ReadOnly Property EnumIndexed(ByVal type As CustomObject.CustomTypes) As CustomObject
Get
Return Me.FirstOrDefault(Function(x) x.Type = type)
End Get
End Property
End Class
It compiles, and runs fine from VB:
Public Sub Test()
Dim collection = New CustomCollection()
Dim output = collection.EnumIndexed(CustomObject.CustomTypes.Testing)
End Sub
However trying to consume this from C# will not work:
var item = collection.EnumIndexed(VbLib.CustomObject.CustomTypes.Other);
But like this will:
var item = collection.get_EnumIndexed(VbLib.CustomObject.CustomTypes.Other);