Ответ 1
Как описано в статье библиотеки MSDN, Resgen.exe использует правила, реализованные методом StronglyTypedResourceBuilder.VerifyResourceName(). Я просто скопирую, что говорит библиотека MSDN:
Если ключевым параметром является пустая строка (""), возвращается строка, состоящая из одного символа подчеркивания (_). Если параметр ключа не является пустой строкой, метод VerifyResourceName сравнивает каждый символ в строке с набором недопустимых токенов на основе языка, указанного параметром поставщика. Любой недопустимый символ в строке заменяется символом подчеркивания. Символы, которые будут заменены символом подчеркивания, следующие:
'' (пробел), U + 00A0 (неразрывное пространство), '.' (период), ',' (запятая), ';' (точка с запятой), '|', '~', '@', '#', '%', '^', '&', '*', '+', '-', '/', '\','<',' > ','? ',' [','] ',' (',') ',' {','} ',' '' (quote), '' ' (апостроф), ':' и '!'.
Примечание
Сильно типизированные ресурсы не позволяют использовать ключевые слова языка (такие как if, for и т.д.) В качестве имен ключей ресурсов. Тем не менее, шаблон проектирования System.CodeDom позволяет использовать ключевые слова языка, префикс ключевого слова с символом подчеркивания. Метод VerifyResourceName вызывает метод CreateValidIdentifier для обеспечения выполнения этого проекта. Например, если вы используете имя ресурса, которое совпадает с ключевым словом языка, например, для, имя отображается как _for в генерируемом строго типизированном классе ресурсов.
Посмотрев исходный код класса StronglyTypedResourceBuilder, документация верна.