Инициализаторам коллекции просто требуется метод Add
с совместимой подписью , и он не должен существовать в самом типе. (Однако коллекция должна реализовывать IEnumerable
, чтобы "доказать", что это коллекция.)
Добавить метод расширения ...
public static class RequiredItemListExtensions
{
public static void Add(this List<RequiredItem> list, string pattern, double req)
{
list.Add(new RequiredItem(pattern, req));
}
}
Тогда вы можете инициализировать его так, как хотите.
public readonly List<RequiredItem> requiredItemNames = new List<RequiredItem>
{
{"ilder_Component/Construction", 300},
{"nt/Computer",150},
{"_Component/Girder",100},
{"ponent/MetalGrid",70},
{"Motor",150},
{"MyObjectBuilder_Component/SteelPlate",333}
};
Насколько я помню, при реализации Roslyn Microsoft удалось убрать проверку, которая помешала разрешению метода выбрать метод расширения. Это изменение, специфичное для Roslyn, а не для версии. В моем тесте, даже когда я опускаю свойство LangVersion
до 3,0 (где инициализаторы коллекции были впервые введены, но методы расширения еще не выбраны), он все равно работает, тогда как компилятор, предшествующий Roslyn, все равно будет выдавать ошибку в вопрос.
Обновление: Подтверждено. Я нашел установку VS 2013, попробовал тот же код с явно выбранной версией 5.0, и он выдал ту же ошибку. Я загрузил тот же проект в VS 2015, версия 5.0 все еще выбрана, и он скомпилирован. Для моего ответа на работу космическим инженерам потребуется использовать компилятор C # на основе Roslyn.