Conversione automatica del tipo in C#

Conversione automatica del tipo in C#

C# supporta la conversione implicita per i tipi e puoi usarla per i tuoi tipi personalizzati come i seguenti:

 class CustomValue
 {
     public static implicit operator int(CustomValue v)  {  return 4;  }

     public static implicit operator float(CustomValue v) {  return 4.6f;  }
 }

 class Program
 {
     static void Main(string[] args)
     {
         int x = new CustomValue(); // implicit conversion 
         float xx = new CustomValue(); // implicit conversion 
     }
 }

E supporta i metodi di estensione, ma non supporta la conversione implicita come metodo di estensione come il seguente:

static class MyExtension
{
    // Not supported
    public static implicit operator bool(this CustomValue v)
    {
        return false;
    }
}

No, hai torto. Il codice seguente non verrà compilato:

class MyClass
{
    public override string ToString()
    {
        return "MyClass";
    }
}

static void MyMethod(string s) { }

static void Main(string[] args)
{
    MyMethod(new MyClass());   //compile error
}

Il compilatore non otterrà il tipo di MyMethod parametro(che è string ) prima e prova a convertire l'argomento passato (il cui tipo è MyClass ) ad esso. Immagino che tu sia probabilmente fuorviato da qualcosa come Console.WriteLine . Basandosi sul codice sopra, Console.WriteLine(new MyClass()) stampa "MyClass" sulla console, sembra che il compilatore sa dovresti passare una stringa a Console.WriteLine e prova a convertire MyClass accordare. Ma l'essenziale è Console.WriteLine ha diversi overload, uno di questi è per object :

//from Console.cs
public static void WriteLine(object value)
{
    //in this method there is something like
    //Console.WriteLine(value.ToString());
}

Credo che quello che stai cercando sia la conversione implicita, che è descritta qui:http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx.

Tuttavia, aggiungerli all'oggetto sarebbe una pessima idea, per i motivi illustrati nella pagina a cui ho collegato.