type multiple method generic create constraint constain clase c# .net generics constructor

multiple - generic type c#



Inicializando una Generic.List en C# (7)

En C #, puedo inicializar una lista usando la siguiente sintaxis.

List<int> intList= new List<int>() { 1, 2, 3 };

Me gustaría saber cómo funciona la sintaxis {} y si tiene un nombre. Hay un constructor que toma un IEnumerable , podrías llamar eso.

List<int> intList= new List<int>(new int[]{ 1, 2, 3 });

Eso parece más "estándar". Cuando deconstruyo el constructor predeterminado para la Lista, solo veo

this._items = Array.Empty;

Me gustaría poder hacer esto.

CustomClass abc = new CustomClass() {1, 2, 3};

Y poder usar la lista 1, 2, 3 . ¿Como funciona esto?

Actualizar

Jon Skeet respondió

Está llamando al constructor sin parámetros, y luego llamando a Agregar:

> List<int> tmp = new List<int>(); > tmp.Add(1); tmp.Add(2); tmp.Add(3); > List<int> intList = tmp;

Entiendo lo que es. Quiero saber cómo. ¿Cómo sabe esa sintaxis para llamar al método Agregar?

Actualizar

Lo sé, qué cliché aceptar una respuesta de Jon Skeet. Pero, el ejemplo con las cuerdas y los puntos es increíble. También una página de MSDN muy útil es:


Creo que es un atajo al método .Add. Sin embargo, nunca intenté anularlo, así que no sé si es posible.



En lo que a mí respecta, la adición de elementos a través de la inicialización de objetos busca un método Agregar. Entonces, como List <int> tendrá void Add (int), funcionará.

Para usarlo en tu clase, simplemente agrega

class CustomClass { public void Add(int num) { // Your code here } }

Tu clase debería implementar IEnumerable, como señaló Hallgrim.


En realidad está usando el método .Add . Lo que significa que está llamando .Add para cada elemento en los corchetes dentro del constructor.


Esto se llama inicializador de colección . Está llamando al constructor sin parámetros, y luego llamando a Agregar:

List<int> tmp = new List<int>(); tmp.Add(1); tmp.Add(2); tmp.Add(3); List<int> intList = tmp;

Los requisitos para el tipo son:

  • Implementa IEnumerable
  • Tiene sobrecargas de Add que son apropiadas para los tipos de argumentos que proporciona. Puede proporcionar argumentos múltiples entre llaves, en cuyo caso el compilador busca un método Add con múltiples parámetros.

Por ejemplo:

public class DummyCollection : IEnumerable { IEnumerator IEnumerable.GetEnumerator() { throw new InvalidOperationException("Not a real collection!"); } public void Add(string x) { Console.WriteLine("Called Add(string)"); } public void Add(int x, int y) { Console.WriteLine("Called Add(int, int)"); } }

Puede usar:

DummyCollection foo = new DummyCollection { "Hi", "There", { 1, 2 } };

(Por supuesto, normalmente querrías que tu colección implementara IEnumerable correctamente ...)



Se llaman inicializadores de colecciones (también ver here ), y la forma en que funcionan es buscando un método Add() que pueda hacer sus pujas. Llama a Add() para cada uno de los enteros que tiene en sus llaves.

La búsqueda del método Add() es pura magia del compilador. Está codificado para encontrar un método de ese nombre.