Как разрешить это предупреждение компилятора "имя ресурса не является допустимым идентификатором"

У меня есть куча предупреждений в проекте Visual Studio 2005, большинство из них предупреждают меня, что имя ресурса не является допустимым идентификатором.

пример:

The resource name 'MB_ArchiveRestore.cs_11' is not a valid identifier.

MSDN online help указывает, что имя ресурса должно быть строго типизировано и не содержать пробелов. Что означает strongly typed?

7 ответов


Strongly typed означает, что переменная, поле или свойство определенного типа, а не просто Object.

public class User
{
    public String FirstName { get; set; } // Strongly typed
    public Object LastName { get; set; } // Weakly typed
}

Если вы используете строго типизированные ресурсы, код генерируется со строго типизированными свойствами для всех ваших ресурсов. В этом случае имя ресурса используется в качестве имени свойства, поэтому оно должно быть допустимым именем свойства C#. Ваш пример MB_ArchiveRestore.cs_11 содержит точку и, следовательно, не является допустимым именем свойства. Генератор кода заменит точку на подчеркивание, чтобы сделать имя действительным и дает вам описанное предупреждение, чтобы сообщить вам об этом.


основываясь на ссылке, которую вы разместили в вопросе, я думаю, что вы, вероятно, спрашиваете о strongly typed resource generation - это означает, что Visual Studio создаст файл ресурсов, который позволит вам получить доступ к ресурсам через типизированные свойства, например,

string fileName = Resources.FileName;
bool someSetting = Resources.AllowDelete;
byte[] binaryResource = Resources.SomeFile;

В отличие от нетипизированных ресурсов, где вы должны привести возвращаемое значение самостоятельно, потому что он возвращает тип System.Объект вместо определенного типа.

string fileName = (string)Resources["FileName"];
bool someSetting = (bool)Resources["AllowDelete"];
byte[] binaryResource = (byte[])Resources["SomeFile"]

проблема возникает из-за . недопустимый символ в идентификаторах.

что означает строго типизированный?

хотя это не актуально для данного конкретного вопроса, "строго типизированный" означает, что объект имеет определенное понятие. Например, вы не можете сделать int i = "5"; в C#, потому что "5" это строка и i целое число-их типы несовместимы друг с другом.

это контрастирует с " слабо типизированные "языки, где понятие" тип " не так сильно. Слабо типизированный язык может решить, что для чего-то вроде i = 5; j = "6"; print (i + j); правильный ответ 11.


"строго типизированный" в данном случае означает, что Visual Studio пытается создать объектную модель для использования, из названия ресурса.

например, скажем, у вас есть файл ресурсов с URL-адресами, которые указывают на ваши любимые веб-сайты. ваши ресурсы что-то вроде:

когда генерируемый ресурс используется для строго введите это, вы получите объектную модель, которая может быть вызвана следующим образом:

string googleUrl = Resources.Google; string msUrl = Resources.Microsoft;

когда у вас есть точка в имени ресурса, генератор кода не может ее использовать, потому что он создаст недопустимые имена в объекте Resources. например:

это будет недопустимо, потому что он попытается создать ресурс с именем Resources.Asp.NET


Я не уверен, что это поможет вам решить вашу проблему, но в интересах ответа на ваш фактический вопрос. Строго типизированная означает, что переменная имеет заданный тип, в отличие от некоторого типа, определенного во время выполнения. Проверьте Википедия

например:

Int32 counter;

означает, что переменная счетчика строго типизирована, поскольку мы знаем, что это Int32. Другие языки или использование динамических ключевых слов означают:

dynamic counter = ResultOfFunc()

означает, что счетчик не строго типизированный, так как он определяется во время выполнения результатом ResultOfFunc().


Я должен был бы догадаться, что он жалуется на _11 в конце, что сделало бы его недействительным файлом c#, таким образом, не действительным ресурсом.


Я думаю, что у вас есть ресурс с именем "MB ArchiveRestore.cs 11". Начиная с VS 2005 компилятор (или, точнее, надстройка) будет автоматически генерировать классы доступа для встроенных ресурсов. Их можно использовать для извлечения ресурсов. Свойство class для вашего примера, вероятно,Properties.Resources.MB_ArchiveRestore.cs_11. Эти stronlgy типизированные классы ресурсов также обеспечивают удобный способ локализации.