Classe conversions implicites
-
21-08-2019 - |
Question
Je sais que je peux utiliser les conversions implicites avec une classe comme suit, mais est-il possible que je puisse obtenir une instance pour retourner une chaîne sans fonte ou conversion?
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();
}
}
La solution
En fait, le compilateur implicitement jeté à Fred
mais puisque vous string
déclarez la variable avec mot-clé le compilateur var
aurait aucune idée de votre intention réelle. Vous pouvez déclarer votre variable sous forme de chaîne et ont implicitement la valeur casté en chaîne.
string d = new Fred();
Autrement dit, vous pourriez avoir déclaré une douzaine d'opérateurs implicites pour différents types. Comment vous attendez le compilateur de pouvoir choisir entre l'un d'eux? Le compilateur choisira le type réel par défaut de sorte qu'il ne sera pas nécessaire d'effectuer une fonte du tout.
Autres conseils
Avec un opérateur implicite (que vous avez), vous devez simplement être en mesure d'utiliser:
string d = new Fred();
vous voulez
var b = new Fred();
pour être de type fred et
var c = new Fred();
être de type chaîne? Même si les déclarations sont identiques?
Comme mentionné par les autres affiches, lorsque vous déclarez un nouveau Fred (), il sera de type Fred à moins que vous donnez une indication qu'il doit être string
Malheureusement, dans l'exemple, c est de type Fred. Alors que Freds peuvent être coulés à cordes, en fin de compte, c est un Fred. Pour forcer d à une chaîne, vous devez lui dire de lancer Fred comme une chaîne.
Si vous voulez vraiment c pour être une chaîne, pourquoi ne pas déclarer tout comme une chaîne?