更新: 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 月

增加了可能导致此错误的原因。

信息补充。