Il y a deux parties à cette question :
- Comment les littéraux de chaîne fonctionnent
- Comment faire la même chose pour votre propre classe
Littéraux de chaîne
L'expression "bar"
est déjà une valeur de type string
. L'opérateur d'assignation copie simplement la référence, comme il le fait pour tout le reste. Les littéraux de chaîne entraînent la création d'objets de chaîne lorsque c'est possible (mais réutilisés, donc si vous avez ce code dans une boucle, il y a seulement un seul objet string
). Il y a une certaine subtilité ici pour les littéraux de chaîne interpolés autour de FormattableString
, mais je vais ignorer cela dans le cadre de cette question.
Créer votre propre syntaxe similaire à un littéral
Vous ne pouvez pas faire en sorte que l'opérateur d'assignation appelle directement un constructeur implicitement, non. Vous pourriez ajouter une conversion implicite de int
à SomeClass
, mais je le déconseillerais généralement.
Voici un exemple complet au cas où vous le voudriez vraiment, mais ce n'est vraiment pas idiomatique. Dès que vous avez des conversions implicites, cela rend plus difficile de raisonner sur la résolution des surcharges par exemple - et quiconque lit votre code doit savoir qu'il y a une conversion implicite définie par l'utilisateur.
using System;
class SomeClass
{
public int Value { get; }
public SomeClass(int value) => Value = value;
public static implicit operator SomeClass(int value) =>
new SomeClass(value);
}
public class Program
{
static void Main()
{
SomeClass x = 123;
Console.WriteLine(x.Value);
}
}
Notez que si la fonctionnalité nouveau typé ciblé new
devient disponible en C# 8, vous pourriez écrire :
SomeClass x = new(123);
... donc vous économiseriez au moins la duplication, même pour les champs.