Почему это создает исключение нулевой стоимости? - PullRequest
1 голос
/ 29 ноября 2010

Исключение, которое я получаю:

Инициализатор типа для MyNamespace. Программа вызвала исключение

Внутреннее исключение говорит

Сообщение: Значение не может быть нулевым. Имя параметра: коллекция
Источник: ... HashSet ...

Это наводит меня на мысль, что ошибка происходит в строке, указанной ниже ...

class Program
{
    public static IEnumerable<char> WordCharacters = ExpandCharacterSet("A-Za-z0-9_");
    public static IEnumerable<char> NonWordCharacters = ExpandCharacterSet("^A-Za-z0-9_");
    public static IEnumerable<char> SpaceCharacters = ExpandCharacterSet(" \f\n\r\t\v");
    public static IEnumerable<char> NonSpaceCharacters = ExpandCharacterSet("^ \f\n\r\t\v");
    public static IEnumerable<char> DigitCharacters = ExpandCharacterSet("0-9");
    public static IEnumerable<char> NonDigitCharacters = ExpandCharacterSet("^0-9");
    public static IEnumerable<char> WildCharacters = ExpandCharacterSet("^\n");
    public static IEnumerable<char> AllCharacters = Enumerable.Range(0, 256).Select(Convert.ToChar).Where(c => !char.IsControl(c));

    public static IEnumerable<char> ExpandCharacterSet(string set)
    {
        if (set.Length == 0)
            return "";

        var sb = new StringBuilder();
        int start = 0;
        bool invertSet = false;

        if (set[0] == '[' && set[set.Length - 1] == ']')
            set = set.Substring(1, set.Length - 2);
        if (set[0] == '^')
        {
            invertSet = true;
            set = set.Substring(1);
        }
        set = Regex.Unescape(set);

        foreach (Match m in Regex.Matches(set, ".-.|."))
        {
            if (m.Value.Length == 1)
                sb.Append(m.Value);
            else
            {
                if (m.Value[0] > m.Value[2]) throw new ArgumentException("Invalid character set.");
                for (char c = m.Value[0]; c <= m.Value[2]; ++c)
                    sb.Append(c);
            }
        }

        if (!invertSet) return sb.ToString();

        var A = new HashSet<char>(AllCharacters); // <---- change this to "ABC" and the error goes away
        var B = new HashSet<char>(sb.ToString());
        A.ExceptWith(B);
        return A;
    }

    static void Main(string[] args)
    {
    }
}

Но я не знаю почему. Когда я печатаю символы,

Console.WriteLine(string.Concat(AllChars));

Он печатает каждый символ, как ожидалось. Так почему же HashSet считает, что он нулевой?

Ответы [ 3 ]

5 голосов
/ 29 ноября 2010

Я предполагаю, что ExpandCharacterSet используется для инициализации другого статического поля.Нет никакой гарантии порядка, в котором будут инициализированы два статических поля, и поэтому, вероятно, он пытается инициализировать другое поле, прежде чем инициализирует AllChars.

Попробуйте переместить назначения в явный статический конструктор с правильнымпорядок инициализации.

например, если ваш текущий код имеет:

public static IEnumerable<char> AllChars = Enumerable.Range(0, 256).Select(Convert.ToChar).Where(c => !char.IsControl(c));
public static IEnumerable<char> Expanded = ExpandCharacterSet(...);

Сделайте это вместо:

public static IEnumerable<char> AllChars;
public static IEnumerable<char> Expanded;
static <ClassName> {
    AllChars = Enumerable.Range(0, 256).Select(Convert.ToChar).Where(c => !char.IsControl(c));
    Expanded = ExpandCharacterSet(...);
}
0 голосов
/ 29 ноября 2010

Я думаю, что AllChars устанавливается равным нулю в какой-то другой части вашего кода, потому что кажется, что два вышеописанных метода работают нормально.

0 голосов
/ 29 ноября 2010

Я не получаю ничего, кроме как на основе следующих двух строк кода. Где строка кода, которая выдает исключение?

public static IEnumerable<char> AllChars = Enumerable.Range(0, 256)
                                            .Select(Convert.ToChar)
                                            .Where(c => !char.IsControl(c));

var A = new HashSet<char>(AllChars); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...