下記のコードでなぜlistがlist2もろとも参照地が変わったのか理解できません。
注意: 私はC#に詳しくありません。

private void TestMethod(ref List<String> list2){
list2 = new List<String>();
list2.Add("bye-bye!");
}

List<String> list = new List<String>();
list.Add("Hello!");
TestMethod(ref list);
System.Console.WriteLine(list[0]);    // "bye-bye!"

list2 = new List<String>();この部分で新しい番地が確保されたのは分かります。しかしlistの参照地まで変わっているようですがどういうメカニズムですか?listとlist2の共通の参照地にlistとlist2という2つの変数の存在と場所の情報を保存しているのですか?

またPHPやjavascriptでどのような挙動になるのか教えてください。(Javaには厳密な参照渡しは存在しておらず”参照地の値渡し(参照地の番地をコピーして渡す)”ということは知っています)