编译器错误 CS0246

未能找到类型或命名空间名称“type/namespace”(是否缺少 using 指令或程序集引用?)

找不到在程序中使用的类型或命名空间。 你可能忘记引用 (References) 包含此类型的程序集,或者可能未添加所需的 using 指令。 或者,可能想要引用的程序集存在问题。

以下情况下会导致编译器错误 CS0246。

  • 类型或命名空间的名称是否拼写有误? 没有正确的名称,编译器找不到类型或命名空间的定义。 这通常是因为类型名称中使用大小写不正确。 例如, Dataset ds; 生成 CS0246,因为“Dataset”中的 s,必须大写。

  • 如果错误针对的是命名空间名称,那么你是否已将引用 (References) 添加到包含命名空间的程序集? 例如,你的代码可能包含指令 using Accessibility。 但是,如果你的项目未引用程序集 Accessibility.dll,将报告错误 CS0246。 有关详细信息,请参阅管理项目中的引用

  • 如果错误针对的是类型名称,那么你是否包含了正确的 using 指令,或者是否完全限定了类型的名称? 请考虑以下声明: DataSet ds。 若要使用 DataSet 类型,需要以下两项。 首先,你需要对程序集的引用,该程序集包含 DataSet 类型的定义。 其次,你需要针对 using 所在命名空间的 DataSet 指令。 例如,因为 DataSet 位于 System.Data 命名空间中,在代码的开头你需要以下指令: using System.Data

    using 指令则不需要。 但是,如果省略该指令,则在对其引用时必须完全限定 DataSet 类型。 完全限定意味着每次在代码中引用该类型时要指定命名空间和类型。 如果在上一示例中省略 using 指令,则必须编写 System.Data.DataSet ds 以声明 ds 而不是 DataSet ds

  • 是否在应该为类型的地方使用了变量或某种其他语言元素? 例如,在 is 语句中,如果使用 Type 对象而不使用实际类型,则会出现错误 CS0246。

  • 引用的程序集是否针对比程序的目标框架版本更高的框架版本而生成? 或者,引用的项目所面向的框架版本是否高于程序的目标框架版本? 例如,你在处理面向 .NET Framework 4.6.1 的项目,但使用的是面向 .NET Framework 4.7.1 的项目中的类型。 这样就显示错误 CS0246。

  • 所有引用的项目是否都包含在所选的生成配置和平台中? 使用 Visual Studio 配置管理器确保所有引用的项目都标记为使用所选配置和平台生成。

  • 是否使用了 using 别名指令 而没有完全限定类型名称? using 别名指令不使用源代码文件中的 using 指令来解析类型。 以下示例生成 CS0246,因为类型 List<int> 未完全限定。 usingSystem.Collections.Generic 指令不会避免该错误。

    using System.Collections.Generic;  
    
    // The following declaration generates CS0246.  
    using myAliasName = List<int>;
    
    // To avoid the error, fully qualify List.  
    using myAliasName2 = System.Collections.Generic.List<int>;  
    

    如果在之前运行的代码中遇到此错误,首先在解决方案资源管理器中查找丢失或未解析的引用。 是否需要重新安装 NuGet 包? 有关生成系统如何搜索引用方面的信息,请参阅 解析团队生成中的文件引用。 如果所有引用都似乎正确,请在源代码管理历史记录中查看在 .csproj 文件和/或你的本地源文件中有哪些更改。

    如果尚未成功访问过该引用,则使用对象浏览器来检查应包含此命名空间的程序集并验证命名空间是否存在。 如果使用对象浏览器验证出该程序集包含命名空间,请尝试删除命名空间的 using 指令,并查看其他中断部分。 根本问题可能涉及另一个程序集中的某些其他类型。

以下示例生成 CS0246,因为必需的 using 指令缺失。

// CS0246.cs  
//using System.Diagnostics;  
  
public class MyClass  
{  
    // The following line causes CS0246. To fix the error, uncomment  
    // the using directive for the namespace for this attribute,  
    // System.Diagnostics.  
    [Conditional("A")]  
    public void Test()  
    {  
    }  
  
    public static void Main()  
    {  
    }  
}  

下面的示例会导致 CS0246,因为应该在使用实际类型的时候使用了 Type 类型。

// CS0246b.cs  
using System;  
  
class ExampleClass  
{  
    public bool supports(object o, Type t)  
    {  
        // The following line causes CS0246. You must use an  
        // actual type, such as ExampleClass, String, or Type.  
        if (o is t)  
        {  
            return true;  
        }  
        return false;  
    }  
}  
  
class Program  
{  
    public static void Main()  
    {  
        ExampleClass myC = new ExampleClass();  
        myC.supports(myC, myC.GetType());  
    }  
}