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(); 
    }
}
Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top