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

ли добавить метод расширения конструктора? Я хочу добавить конструктор List <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]);
}

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

Ответы на вопрос(4)

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

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

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

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

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

 Thomas Eding25 июл. 2012 г., 23:56
Было бы действительно полезно расширить конструкторstring так что это может работать сdefault(string), Либо так, либо предоставьте конструктор по умолчанию дляstring.
 ken2k01 июл. 2013 г., 15:35
Эта функция может помочь, предоставляя общую точку инициализации для всех классов, которые наследуют базовый класс. Например,Spec1 а такжеSpec2 наследовать отBase абстрактный класс (все классы, которые нельзя изменить (например, скомпилированная сборка)). Добавив конструктор расширения без параметров вBase (а также свойства / методы расширения), можно обеспечить логику инициализации для обоихSpec1 а такжеSpec2 в одном конструкторе расширения.
 ken2k01 июл. 2013 г., 15:38
Я извлек этот вариант использования из сценария реального мира: я хотел создать базовый класс для некоторых из моих сущностей Entity Framework и добавить некоторые вещи для инициализации для всех них, используя один конструктор расширения.
 David Williams07 июн. 2013 г., 18:42
Я понимаю, что возвращаю зомби к жизни, но одно место, где было бы очень полезно создать расширения, - это исключения. Я хотел бы заменить параметр сообщения в большинстве расширений перегрузкой, которая принимает аргументы формата и params object [], так что мне не нужно явно вызывать string.Format () для создания сообщения.
 Eric Ouellet05 мар. 2012 г., 18:24
Привет, Эрик. Вот пример, который у меня есть. Не знаю, хорошо ли это, но ... Я получил более 50 классов из Silverlight 2.0, которые мне нужно преобразовать в WPF 4.0. Класс WriteableBitmap имеет конструктор, который действительно отличается. Гораздо сложнее в WPF, но мы можем исправить каждые 4 новых параметра. Имея возможность создать (переопределить) новый конструктор, мы сможем сэкономить много переписывания кода. Благодарю.

это для некоторого объяснения.

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

 Alex Nolasco14 июл. 2015 г., 22:58
Но у Свифта это есть.
 Eric Lippert24 янв. 2011 г., 17:03
Ваш недостаток оптимизма является разумным.
Решение Вопроса

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

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

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

 Greg Biles12 июл. 2011 г., 03:20
Отличная альтернатива! Я использовал ваш пример для добавления метода Initialize к объекту DataColumn. Я полагаю, что .AnEvenBetterConstructor (...) было бы слишком много.
 Tar26 янв. 2011 г., 07:52
Большой! Я упустил эту возможность - это именно то, что я искал!

Ваш ответ на вопрос