2016-11-16 3 views
4

У меня есть один внутренний MyLists статического класса со статическим членомстатический ImmutableArray не инициализируются

internal static ImmutableArray<string> MyList = new ImmutableArray<string> { "asd", "qwe" };

В других государственных испытаниях теста-класса У меня есть функция MyTest, которая выбирает и сравнивает список. Я получаю

Additional information: The type initializer for 'TestMyLists' threw an exception. Object reference not set to an instance of an object.

[TestClass] 
public class MyTests { 
    [TestMethod] 
    public void TestMyLists() { 
    var list = MyLists.MyList.Select(s => s + ".foo"); 
    } 
} 

Когда я отладки я вижу статический ImmutableArray как значение = UNINITIALIZED. Зачем?

+0

Какое значение od Lists или Lists.List? – Jacek

+1

Что такое Списки здесь? не очень хорошая практика, чтобы назвать ваши локальные переменные такими же, как и предопределенные. например: Список –

+0

Я думаю, что вы должны использовать фабричный метод для создания объекта ImmutableArray. –

ответ

5

Как уже упоминалось на MSDN, Вы должны использовать Create() метод вместо того, чтобы использовать конструктор для этого типа массива:

internal static ImmutableArray<string> List = ImmutableArray.Create("asd", "qwe"); 

О причине, почему я укажу Вам на article сухоцветов Landwerth, где он описывает :

Значение по умолчанию ImmutableArray<T> имеет базовый массив, инициализированный нулевой ссылкой. В этом случае он ведет себя так же, как ImmutableArray<T>, который был инициализирован пустым массивом, т. Е. Свойство Length возвращает 0, и итерация по нему просто не дает никаких значений. В большинстве случаев это поведение, которое вы ожидаете. Однако в некоторых случаях вам может понадобиться знать, что базовый массив еще не инициализирован. По этой причине ImmutableArray<T> предоставляет свойство IsDefault, которое возвращает true, если базовый массив является ссылкой null. Например, вы можете использовать эту информацию для реализации ленивой инициализации:

+0

Мой VS2015 не видит метод Create. Любые идеи почему? У меня есть с использованием System.Collections.Immutable; Редактировать: вы не должны указывать ditoslav

+0

Метод Create() должен находиться в том же пакете, что и ImmutableArray, полученный из пакета NuGet - https://www.nuget.org/packages/Microsoft.Bcl.Immutable/ Проверить если у вас установлена ​​последняя версия и все необходимые зависимости. – Tatranskymedved