Ho definito conversione di stringhe implicita da/a un certo tipo in C# (codice fittizio):Perché l'operatore "as" non utilizza un operatore di conversione implicito in C#?
public class MyType
{
public string Value { get; set; }
public static implicit operator MyType(string fromString)
{
return new MyType { Value = fromString };
}
public static implicit operator string(MyType myType)
{
return myType.Value;
}
}
qualche parte nel codice libreria esterna, un'istanza di MyType
viene passata ad un metodo, come parametro object
. Parte di questo metodo assomiglia a qualcosa del genere:
private void Foo(object value)
{
// ... code omitted
var bar = value as string // note that value is an instance of MyType at runtime
if(bar != null) // false, cast fails
{
// ... code omitted
}
}
Perché il cast non utilizza il convertitore implicito? Pensavo che il punto fondamentale di questi fosse rendere possibile il casting e l'uso trasparente?
Questo funziona se MyType
ha un convertitore explicit
? Se è così, (come) posso avere entrambi?
A proposito, il cast funziona sicuramente se il tipo è noto al in fase di compilazione. È perché gli operatori sono static
? C'è qualcosa come operatori di conversione non statici?
P.S. In realtà sono più interessati alle differenze tra il comportamento in fase di compilazione e di comportamento di runtime, quindi ho un follow-up domanda: Why are implicit type conversion operators not dynamically usable at runtime in C#?
Per inciso, non ho mai sentito l'operatore 'as' indicato come" soft cast "prima. –
@JonSkeet che mi sorprende davvero, forse non è un termine ufficiale, ma l'ho sicuramente visto molte volte. – MarioDS
Una ricerca per "soft cast" e C# mi dà 636 risultati, che è un * minuscolo * numero nella mia vista. Lo eviterei sicuramente in futuro - è certamente * non * parte della terminologia specifica C#. –