Pregunta

Yo sé que puedo usar las conversiones implícitas con una clase de la siguiente manera, pero ¿hay alguna manera de que pueda obtener una instancia para devolver una cadena sin una conversión o conversión?

public class Fred
{
    public static implicit operator string(Fred fred)
    {
        return DateTime.Now.ToLongTimeString();
    }
}

public class Program
{
    static void Main(string[] args)
    {
        string a = new Fred();
        Console.WriteLine(a);

        // b is of type Fred. 
        var b = new Fred(); 

        // still works and now uses the conversion
        Console.WriteLine(b);    

        // c is of type string.
        // this is what I want but not what happens
        var c = new Fred(); 

        // don't want to have to cast it
        var d = (string)new Fred(); 
    }
}
¿Fue útil?

Solución

De hecho, el compilador implícitamente fundido Fred a string pero ya que está declarando la variable con la palabra clave var el compilador no tendría ni idea de su intención real. Se podría declarar la variable como una cadena y tienen el valor implícito fundido a cadena.

string d = new Fred();

Dicho de otro modo, es posible que haya declarado una docena de operadores implícitos para diferentes tipos. Como era de esperar que el compilador sea capaz de elegir entre uno de ellos? El compilador elegir el tipo real de forma predeterminada por lo que no tendrá que realizar un reparto en absoluto.

Otros consejos

Con un operador implícita (que hay) que sólo debe ser capaz de utilizar:

 string d = new Fred(); 

desea

var b = new Fred();

a ser de tipo Fred, y

var c = new Fred();

a ser de tipo cadena? A pesar de que las declaraciones son idénticos?

Según lo mencionado por los otros carteles, cuando se declara un nuevo Fred (), que será de tipo Fred menos que dar alguna indicación que debería ser un string

Por desgracia, en el ejemplo, c es de tipo Fred. Mientras Fred pueden ser emitidos en cadenas, en última instancia, c es un Fred. Para forzar d en una cadena, que tiene que decirle a emitir el Fred como una cadena.

Si realmente quiere c sea una cadena, ¿por qué no declarará como una cadena?

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