las conversiones implícitas de clase
-
21-08-2019 - |
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();
}
}
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?