Domanda

So che posso usare le conversioni implicite con una classe come segue, ma c'è un modo che io possa avere un esempio per restituire una stringa senza un cast o la conversione?

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(); 
    }
}
È stato utile?

Soluzione

In realtà, il compilatore implicitamente espressi Fred a string ma dal momento che si dichiara la variabile con var parola chiave il compilatore non avrebbe alcuna idea della vostra intenzione reale. Si potrebbe dichiarare la variabile come stringa e hanno il valore implicitamente colato a stringa.

string d = new Fred();

altre parole, si potrebbe avere dichiarato una dozzina di operatori impliciti per i diversi tipi. Come ci si aspetterebbe al compilatore di essere in grado di scegliere tra uno di loro? Il compilatore sceglierà il tipo effettivo di default in modo che non dovrà eseguire un cast a tutti.

Altri suggerimenti

Con un operatore implicita (che si ha) si dovrebbe solo essere in grado di utilizzare:

 string d = new Fred(); 

desideri

var b = new Fred();

per essere di tipo fred, e

var c = new Fred();

per essere di tipo stringa? Anche se le dichiarazioni sono identiche?

Come già detto da altri manifesti, quando si dichiara una nuova Fred (), sarà di tipo Fred meno che non si dare qualche indicazione che dovrebbe essere un string

Purtroppo, nell'esempio, c è di tipo Fred. Mentre Freds possono essere lanciati in stringhe, in ultima analisi, c è un Fred. Per forzare d in una stringa, è necessario indicare per lanciare il Fred come una stringa.

Se si vuole veramente c sia una stringa, perché non solo dichiararla come una stringa?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top