如何解决此“资源名称不是有效标识符”编译器警告

时间:2010-02-16 15:46:54

标签: c# resources compiler-warnings

我在Visual Studio 2005项目中遇到了一堆警告,其中大多数警告我资源名称不是有效的标识符。

示例:

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

MSDN online help表示资源名称需要强类型,不包含空格。强类型的确切含义是什么?

7 个答案:

答案 0 :(得分:9)

根据您在问题中发布的链接,我认为您可能会询问strongly typed resource generation - 这意味着Visual Studio将生成一个资源文件,允许您通过类型属性访问资源,例如

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

与非类型化资源相反,您必须自己强制转换返回值,因为它返回System.Object类型而不是特定类型。

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

答案 1 :(得分:9)

强类型表示变量,字段或属性属于特定类型,而不仅仅是Object

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

如果使用强类型资源,则会为所有资源生成具有强类型属性的代码。在这种情况下,资源名称用作属性名称,因此它必须是有效的C#属性名称。您的示例MB_ArchiveRestore.cs_11包含一个点,因此不是有效的属性名称。代码生成器将使用下划线替换点以使名称有效,并为您提供所描述的警告以通知您。

答案 2 :(得分:7)

出现此问题是因为.不是标识符中的有效字符。

  

强类型的确切含义是什么?

虽然它与这个特定问题不相关,但“强类型”意味着一个对象具有明确的类型概念。例如,您无法在C#中执行int i = "5";,因为“5”是一个字符串而i是一个整数 - 它们的类型彼此不兼容。

这与“弱类型”语言形成鲜明对比,“类型”的概念并不强烈。弱类型语言可能会决定类似i = 5; j = "6"; print (i + j);之类的语句,正确的响应是11。

答案 3 :(得分:1)

在这种情况下,“强类型”表示Visual Studio正在尝试从您的资源名称生成供您使用的对象模型。

例如,假设您有一个包含指向您喜欢的网站的网址的资源文件。你的资源就像:

当资源生成用于强类型化时,最终会得到一个可以像这样调用的对象模型:

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

当您在资源名称中有句点时,代码生成器无法使用它,因为它会在Resources对象中创建无效名称。例如:

这将无效,因为它会尝试创建名为Resources.Asp.NET

的资源

答案 4 :(得分:0)

我不确定它是否会帮助您解决问题但是为了回答您的实际问题。强类型意味着变量属于给定类型,而不是在运行时确定的某种类型。查看Wikipedia

例如:

Int32 counter;

表示计数器变量是强类型的,因为我们知道它是Int32。其他语言或动态关键字的使用意味着:

dynamic counter = ResultOfFunc()

表示计数器不是强类型的,因为它是在运行时由ResultOfFunc()的结果确定的。

答案 5 :(得分:0)

我不得不猜测它最后会抱怨_11,这会使它不是一个有效的C#文件,因此不是一个有效的资源。

答案 6 :(得分:0)

我猜你有一个名为“MB ArchiveRestore.cs 11”的资源。 从VS 2005开始,编译器(或更确切地说是一个附加工具)将自动生成嵌入式资源的访问类。这些可用于检索资源。 您的示例的类属性可能是Properties.Resources.MB_ArchiveRestore.cs_11。 这些stronlgy类型的资源类也提供了一种方便的本地化方式。