更新: 2008 年 7 月
错误消息
找不到类型或命名空间名称“type/namespace”(是否缺少 using 指令或程序集引用?)
未找到类型。可能忘了引用 (/reference) 包含该类型的程序集,或者可能未用 using 指令正确地限定其用法。
出现此错误的几个原因是:
试图使用的类型名称或命名空间名称可能拼写错误(包括正确的大小写)。没有正确的名称,编译器就无法找到在代码中引用的类型或命名空间的定义。这种情况最常发生,原因是 C# 区分大小写,而在引用类型时没有使用正确的大小写。例如,Dataset ds; 会生成 CS0246;请注意,Dataset 中的 s 没有大写。
如果错误的原因在于命名空间名称,则可能是没有引用 (/reference) 包含该命名空间的程序集。例如,代码可能包含 using Accessibility;。但是,如果项目不引用程序集 Accessibility.dll,则会遇到 CS0246。有关如何在开发环境中添加引用的信息,请参见“添加引用”对话框。
如果错误的原因在于类型名称,则可能是没有使用正确的 using 指令,或没有完全限定该类型的名称。考虑下面的代码行:DataSet ds;。为了能够使用 DataSet 类型,您需要做以下两件事。第一,需要一个对包含 DataSet 类型定义的程序集的引用。第二,需要对 DataSet 所在的命名空间使用 using 指令。例如,由于 DataSet 位于 System.Data 命名空间中,所以需要在代码的开头有以下语句:using System.Data;。
第二步不是必需的。但如果省略这一步,则要求在引用 DataSet 类型时对它进行完全限定。完全限定 DataSet 类型意味着每次在代码中引用它时都要使用命名空间和类型。所以,如果决定跳过第二步,您需要将上述声明代码更改为:System.Data.DataSet ds;。
如果是非类型的错误,说明您可能在需要类型时使用了变量或其他对象。例如,在 is 语句中,如果您使用 Type 对象而不是实际的类型,将会遇到此错误。
如果使用 using 别名指令但不完全限定类型名称,则生成此错误。using 别名指令不使用源代码文件中的其他 using 指令来解析类型。例如,下面的代码将生成 CS0246,因为虽然存在用于 System.Collections.Generic 的 using 指令,但没有完全限定类型 List<int>:
using System.Collections.Generic; // Generates CS0246: using myAliasName = List<int>; // Does not generate an error: using myAliasName2 = System.Collections.Generic.List<int>
下面的示例生成 CS0246:
// CS0246.cs
// using System.Diagnostics;
public class MyClass
{
[Conditional("A")] // CS0246, uncomment using directive to resolve
public void Test()
{
}
public static void Main()
{
}
}
下面是一个示例,其中使用了 Type 类型的对象,但应该使用实际的类型(上面的第 4 种情况):
// CS0246b.cs
using System;
class C
{
public bool supports(object o, Type t)
{
if (o is t) // CS0246 – t is not a type
{
return true;
}
return false;
}
public static void Main()
{
}
}
修订记录
日期 |
修订记录 |
原因 |
---|---|---|
2008 年 7 月 |
增加了可能导致此错误的原因。 |
信息补充。 |