C#’owe parametry ref i out dla Visual Basic

Dziasiaj opiszę przekazywanie parametrów przez referencje w C# i Visual Basic.
W C# robi sie to z użyciem słowa kluczowego ref (również out, ale skupię się na ref).

public static void Bar(ref string[] names)
{
    // We can assign value to parameter names
    names = new string[] {"Kate"};
}

static void Main(string[] args)
{
    var names = new string[] { "ala", "ma", "kota" };
    Bar(ref names);
}

Analogicznie w Visual Basic napisalibyśmy to w następujący sposób:

Public Shared Sub Bar(ByRef names As String())
	' We can assign value to parameter names
	names = New String() {"Kate"}
End Sub

Private Shared Sub Main(args As String())
	Dim names = New String() {"ala", "ma", "kota"}
	' calkowity brak informacji o tym ze przekazujemy przez referencje
	Bar(names)
End Sub

A teraz sedno, czyli dlaczego kompilator VB nie pomaga tak jak C#. Gdy próbujemy przekazać do takiej funkcji pole, które jest readonly to w C# dostajemy całkiem logiczny error:

    public class MyClass
    {
        private readonly int[] numbers;

        public void Foo()
        {
            // Error: A readonly field cannot be passed ref or out (except in a constructor)
            Array.Resize<int>(ref numbers, 5); 
        }
    }

Niestety w Visual Basic nie zostaniemy ostrzeżeni w żaden sposób. Wykonanie tej metody nie spowoduje również, że tablica numbers będzie miała 5 elementów.

    Public Class [MyClass]
        Private ReadOnly numbers As Integer()

        Public Sub Foo()
            ' No error or warning
            Array.Resize(Of Integer)(numbers, 5)
        End Sub
    End Class

Ogólna rada „wystrzegaj się słowa kluczowego ByRef w Visual Basic”. W C# trzeba parametr funkcji zadeklarować z ref lub out, a co za tym idzie również w wywołaniu takiej funkcji trzeba użyć ref lub out dla przekazywanych parametrów.
Btw to używanie out jest niezalecane przez FxCop. Bardzo dobrze. Jedyne dobre zastosowanie jakie widzę to TryParse(out …).