No se puede convertir implícitamente el tipo 'X' para 'cadena' - cuándo y cómo se decide que “no se puede”?

StackOverflow https://stackoverflow.com/questions/751303

  •  09-09-2019
  •  | 
  •  

Pregunta

En este momento estoy teniendo con Guids.

Desde luego, recuerdo que durante todo el código en algunos lugares trabaja esta conversión implícita, en otros no lo hace. Hasta ahora no llego a ver el patrón.

¿Cómo decide el compilador cuando no se puede? Es decir, el método de tipo Guid.ToString() está presente, no se llama cuando se necesita esta transformación es?

Puede alguien por favor dígame en qué circunstancias esta transformación se realiza automáticamente y cuando tengo que llamar explícitamente myInstance.ToString()?

¿Fue útil?

Solución

En resumen, cuando hay un operador de conversión implícita o explícita 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();
    } 
}

Otros consejos

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

Sólo funciona cuando hay una conversión explícita, pero la conversión puede no ser muy visible. Por ejemplo al 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 arrojados a la Object tipo y se colocan en una matriz. El método String.Concat llama entonces el método ToString para cada elemento de la matriz para obtener la representación de cadena para ellos.

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

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

A continuación, hay algunas situaciones en las que la llamada es hecha por el .NET Framework, como en String.Format () .

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top