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.