Ahora mismo estoy teniendo con Guids.

Ciertamente me recuerda que todo el código en algunos lugares, esta conversión implícita funciona, en otros no. Hasta ahora no puedo ver el patrón.

Cómo el compilador decide cuándo no? Quiero decir, el tipo de método de Guid.ToString() está presente, ¿no es llamado cada vez que esta transformación es necesaria?

Por favor alguien puede decirme en qué circunstancias esta transformación se realiza de forma automática y cuando tengo que llamar a myInstance.ToString() explícitamente?

(añadido el comentario de volver a su pregunta)
Ensayo y error. Ensayo y error.

OriginalEl autor User | 2009-04-15

3 Comentarios

  1. 32

    En definitiva, cuando hay una conversión implícita o explícita del operador definido:

    class WithImplicit {
        public static implicit operator string(WithImplicit x) {
            return x.ToString();}
    }
    class WithExplicit {
        public static explicit operator string(WithExplicit x) {
            return x.ToString(); }
    }
    class WithNone { }
    
    class Program {
        static void Main() {
            var imp = new WithImplicit();
            var exp = new WithExplicit();
            var none = new WithNone();
            string s1 = imp;
            string s2 = (string)exp;
            string s3 = none.ToString();
        } 
    }
    Sólo miró para mí. No puedo creer que me perdí esta cosa en todos estos años con C#. Supongo que nunca se necesita realmente… Gracias por hacerme aprender algo nuevo hoy.
    Dónde y cómo puedo definir este operador? En la clase de Tipo que supongo? No puedo añadir extensiones estáticas a estos WithImplicit y WithExplicit clases.
    No; no hay tal cosa como una extensión del operador.
    Buen trabajo. Me he estado preguntando cómo sucedió esto y voy a estar usando esta ahora, que yo sepa. Gracias!

    OriginalEl autor Marc Gravell

  2. 4

    No, No hay ninguna conversión implícita de GUID a String, por lo que no funciona en cualquier lugar en el código.

    Sólo funciona cuando hay una conversión explícita, pero la conversión puede que no sea muy visible. Por ejemplo, cuando concatenar cadenas:

    string id = "--" + guidValue + " : " + num;

    Esto puede parecer una conversión implícita de GUID a String, pero no lo es. El código que se genera en realidad se parece a esto:

    string id = String.Concat(new object[] { "--", guidValue, " : ", num });

    Todos los operandos son de fundición para el tipo de Object y se colocan en una matriz. El String.Concat método, a continuación, llama a la ToString método para cada elemento de la matriz para obtener la representación de cadena para ellos.

    OriginalEl autor Guffa

  3. 4

    El único lugar donde efectivamente no necesita llamar a ToString() es cuando la concatenación de cadenas.

    Guid g;
    int i;
    string s = "Hello "+g+' '+i;

    A continuación, hay algunas situaciones donde la llamada es hecha por el .NET Framework, como en De la cadena.(Formato).

    Aparte de eso, el compilador sólo convertir un tipo si se sabe que es compatible (por ejemplo, de la clase base o la implementación de una interfaz o a través de un explícitamente codificado operador de conversión). Cuando se utiliza un yeso y el compilador sabe que el tipo no puede ser compatible (por ejemplo, no en la misma herencia de la línea, y no de las interfaces), también dicen que no se puede convertir. Lo mismo va para los parámetros de tipo genérico.

    No es correcto; el compilador también respeta operadores de conversión. Ver mi post de ejemplos, tanto de las conversiones implícitas y explícitas, que no requieren de la persona que llama a utilizar ToString() o la concatenación de cadenas.
    Estás en lo correcto acerca de la conversión de los operadores, pero que suelen evitar en ellos así que no he mencionado aquí. Voy a cambiar mi respuesta.

    OriginalEl autor Lucero

Dejar respuesta

Please enter your comment!
Please enter your name here