Vous pouvez remplacer manuellement les opérateurs de distribution implicite et explicite d'une classe. Tutorial here. Je dirais que c'est un mauvais design la plupart du temps, cependant. Je dirais qu'il est plus facile de voir ce qui se passe si vous avez écrit
string b = a.ToHtml();
Mais il est certainement possible ...
public class A
{
public string Content { get; set; }
public static implicit operator string(A obj)
{
return string.Concat("<span>", obj.Content, "</span>");
}
}
Pour donner un exemple de pourquoi je ne recommande pas, considérer les points suivants :
var myHtml = "<h1>" + myA + "</h1>";
La volonté ci-dessus, donne "<h1><span>Hello World!</span></h1>"
maintenant, un autre développeur arrive et pense que le code semble au-dessus de pauvres et reformate dans les éléments suivants:
var myHtml = string.Format("<h1>{0}</h1>", myA);
Mais string.Format
appelle en interne ToString
pour tous les arguments qu'il reçoit, donc nous ne sommes plus face à un casting implicite, et par conséquent, l'autre développeur aura changé le résultat de quelque chose comme "<h1>myNamespace.A</h1>"
Ce qui manque ici, c'est un indice sur le fait de surcharger 'ToString()'. – Oliver
@Oliver: ça a été soulevé plusieurs fois, et renversé à plusieurs reprises, comme a) ce n'est pas un casting implicite, et b) c'est encore plus déroutant qu'un casting implicite. –