A conversão de um objeto em C # sempre retorna uma referência para o objeto inicial

Atualmente estou fazendo um projeto em c # trabalhando com formulários do windows. Durante o curso, fiz o seguinte

        void HideButtons(object sender, EventArgs e)
    {
        Button hider = ((Button)sender);
        foreach(Button tohide in hider.Parent.Controls)
            tohide.Hide();
        hider.Show();
        hider.Text = "UnHide";
        hider.Click -= new EventHandler(HideButtons);
        hider.Click += new EventHandler(ShowButtons); 
    }

A finalidade deste código é ter um botão que oculta todos os outros botões no contêiner, exceto ele próprio, e depois transformar em um botão Unhide, que faz a mesma coisa ao contrário.

Agora, tudo bem, exceto que, enquanto eu compilo isso, percebo para mim mesma que acertei um problema. hider é seu objeto único, sendo o retorno de ((Button) remetente). Não é necessariamente a referência ao remetente, e esse código provavelmente não fará nada.

Mas baixo e eis que funciona exatamente como eu queria e inicialmente pensei que seria. O que me fez pensar, o elenco sempre retorna uma referência ao objeto original? Se não, como posso garantir que remetente (botão) = remetente?

Eu sei que não é o caso de duplas / ints, como

        public static int Main()
    {
        int a;
        double b;
        b = 10.5;
        a = (int)b;
        a++;
        return 0;
    }

termina com um ser 11, e sendo b 10.5 Mas isso pode ser devido a duplas / ints sendo estruturas. Esse comportamento me preocupa, e seria bom saber que ele sempre retornará uma referência para que eu possa colocar minha mente preocupada em repouso.

questionAnswers(2)

yourAnswerToTheQuestion