Há uma diferença simples mas importante entre os quatro
ToString( ) gera uma exceção se o objeto for nulo.
Assim, nullObject.ToString( ), sendo nullObject nulo, uma NullReferenceException será lançada.
Convert.ToString( ) retorna string.Empty se o objeto for nulo.
(string) cast assina o objeto se ele for nulo.
MyObject o = (string) NullObject;
Mas quando você acessar qualquer propriedade de MyObject, uma NullReferenceException será disparada. Potencialmente uma InvalidCastException também pode ocorrer, pois essa forma de cast explícito não é segura, nessecitando estar em um bloco try/catch.
MyObject o = nullObject as string atribui null ao objeto se o cast for inválido.
No caso acima, se o caso for inválido será atribuído null a MyObject não necessitando do bloco try/catch, essa operação é conhecida como safe cast ( cast seguro).
Uma melhor abordagem seria verificar se o objeto é de um determinado tipo utilizando o operador ‘is’
if ( myObject is string ) { myObject = o as string }
No código acima verificamos se o objeto é de um determinado tipo e se for realizamos o cast.
Referêcias: Manish Pansiniya’s Blog