Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

102
Views
¿Cómo puede este código establecer una propiedad de solo obtención?

La clase JsonSerializerOptions tiene la siguiente propiedad:

 public IList<Serialization.JsonConverter> Converters { get; }

Este código funciona bien, como se esperaba:

 using System.Text.Json.Serialization; var options = new JsonSerializerOptions(); options.Converters.Add(new JsonStringEnumConverter());

Este código falla, como se esperaba:

 var options = new JsonSerializerOptions { Converters = new List<JsonConverter> { new JsonStringEnumConverter() } }; // `Property or indexer 'JsonSerializerOptions.Converters' cannot be assigned to -- it is read only`

Hasta aquí todo bien. Pero este código también funciona bien, para mi sorpresa:

 var options = new JsonSerializerOptions { Converters = { new JsonStringEnumConverter() } };

¿Qué está pasando exactamente en ese último ejemplo? Puede que esté teniendo un lapso mental, pero no creo que haya encontrado tal sintaxis antes. ¿Alguien puede señalar dónde está documentado? Y no entiendo por qué es capaz de eludir la falta de set o init de la propiedad.

Nota al margen: el código sobre el que pregunto se basó en este artículo .

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

¿Qué está pasando exactamente en ese último ejemplo? Puede que esté teniendo un lapso mental, pero no creo que haya encontrado tal sintaxis antes. ¿Alguien puede señalar dónde está documentado?

Es la sintaxis del inicializador de la colección. Está documentado aquí . Y más directamente con respecto a los accesorios de solo lectura aquí .

Algunas clases pueden tener propiedades de colección donde la propiedad es de solo lectura... No podrá usar la sintaxis del inicializador de colección discutida hasta ahora ya que no se puede asignar una nueva lista a la propiedad. Sin embargo, se pueden agregar nuevas entradas utilizando la sintaxis de inicialización al omitir la creación de la lista.

Esta sintaxis funciona para "tipos de colección que implementan IEnumerable y tiene Add con la firma adecuada como método de instancia o método de extensión".

Para una lectura más profunda, eche un vistazo a la especificación donde dice con mayor precisión:

El objeto de colección al que se aplica un inicializador de colección debe ser de un tipo que implemente System.Collections.IEnumerable o se producirá un error en tiempo de compilación. Para cada elemento especificado en orden, se aplica la búsqueda normal de miembros para encontrar un miembro llamado Add . Si el resultado de la búsqueda de miembros no es un grupo de métodos, se produce un error en tiempo de compilación. De lo contrario, la resolución de sobrecarga se aplica con la lista de expresiones del inicializador de elementos como lista de argumentos y el inicializador de la colección invoca el método resultante. Por lo tanto, el objeto de colección contendrá una instancia aplicable o un método de extensión con el nombre Add para cada inicializador de elemento.

over 4 years ago · Santiago Trujillo Report

0

Es una sintaxis muy oscura que existe en C#, pero no mucha gente la conoce.

El código del último ejemplo es en realidad equivalente a:

 var options = new JsonSerializerOptions(); options.Converters.Add(new JsonStringEnumConverter());

No se asigna a la propiedad Converters , sino que solo inserta los valores en la lista.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!