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.
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);