Можно ли создать конструктор-метод расширения? как?

Можно ли добавить метод расширения конструктора? Я хочу добавить список <T> для получения определенного количества байтов из заданного частично заполненного буфера (без накладных расходов на копирование только соответствующих байтов и т.д.):

...
public static List<T>(this List<T> l, T[] a, int n)
{
    for (int i = 0; i < n; i++)
       l.Add(a[i]);
}
...

поэтому использование будет:

List<byte> some_list = new List<byte>(my_byte_array,number_of_bytes);

Я уже добавил метод расширения AddRange:

public static void AddRange<T>(this List<T> l, T[] a, int n)
{
   for (int i = 0; i < n; i++)
       l.Add(a[i]);
}

Я хочу сделать это как конструктор. Является ли это возможным? если да - как?

Ответ 1

Нет, но если вы изменили свою подпись AddRange, чтобы вернуть экземпляр списка, вы могли бы хотя бы сделать

var list = new List<int>().AddRange(array, n);

который imho, вероятно, более ясен, чем перегрузка конструктора в любом случае.

Ответ 2

Ответ SWeko в основном правильный, хотя, конечно, статья, на которую он ссылается, касается свойств расширения, а не конструкторов расширений.

Мы также сделали грубый проект для конструкторов расширений одновременно с нашими свойствами расширения; они будут хорошим синтаксическим сахаром для шаблона factory. Однако они никогда не проходили стадию проектирования; функция, хотя и симпатичная, на самом деле не нужна и не позволяет запускать какие-либо удивительные новые сценарии.

Если у вас есть действительно удивительная проблема, которую создавали конструкторы расширений, я был бы рад услышать больше деталей. Чем больше обращений в реальном мире мы получаем, тем лучше мы можем оценить относительные достоинства сотен различных предложений функций, которые мы получаем каждый год.

Ответ 3

Одним словом - нет. Взгляните на этот для объяснения.

Они были вырезаны из списка функций С# 3, затем они были вырезаны из списка функций С# 4, и мы можем только надеяться, что они смогут сделать С# 5, но я не очень оптимистичен.

Ответ 4

Я знаю, что это ошибка, просто хочу указать, что вы можете наследовать класс List и сделать что-то вроде этого:

class List<T> : System.Collections.Generic.List<T>
    {
        public List(T[] a, int n)
            : base()
        {
                AddRange(a, n);
        }
    }