变量“variable_name”要么未声明,要么从未赋值

Posted

技术标签:

【中文标题】变量“variable_name”要么未声明,要么从未赋值【英文标题】:The variable 'variable_name' is either undeclared or was never assigned 【发布时间】:2012-01-21 05:42:48 【问题描述】:

我有一个与标题错误相关的问题。我正在使用 c# 和 Visual Studio 2010。

我有一个声明为“公共类 FormularioGeneral : Form”的表单,它是我的应用程序中其他表单的基础。当我尝试访问设计器视图时,我多次收到此错误,如图所示:

所有错误都引用 InitializeComponent 方法内的行,其中值被分配给如下属性:

[...]            
this.PanelMargenIzquierdoCapaBase.BackColor = m_ColorCapaBase;
[...]

但是所有变量都在同一个类中声明为只读属性,并且所有变量都在构造函数中调用的方法中分配。

属性声明:

    protected Color m_VariableName;
    public Color VariableName
    
        get  return m_VariableName; 
        set  
    

构造函数代码:

    public FormularioGeneral()
    
        ConfigurarUI();
        AccionesConstructor();
        InitializeComponent();
        PostInicializacionComponentes();
        EstablecerIcono();
        InicializarLocalizacionFormulario();
    

ConfigurarUI 方法:

public virtual void ConfigurarUI()

        [...]

        m_AltoBordeSuperiorCapaBase = 30;
        m_AltoBordeInferiorCapaBase = 7;
        m_AnchoBordesLateralesCapaBase = 7;

        m_ColorCapaBase = Color.FromArgb(50, 100, 150);
        m_ColorTextoCapaBase = Color.White;
        m_ColorTextoBotonAplicacion = Color.Black;

        m_FuenteTextoIzquierdoCapaBase = new System.Drawing.Font("Verdana", 11.0F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
        m_FuenteTextoCentroCapaBase = new System.Drawing.Font("Verdana", 14.0F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
        [...]

所以,据我所知,所有给出错误的变量都已正确声明并在调用 InitilizeComponent 函数之前分配了一个值。

我卡在这一点上,不知道该怎么做才能解决问题。希望你们中的一些人可以帮助我解决这个问题。

【问题讨论】:

确保在使用代码之前调用构造函数。公共 Form1() FormularioGeneral(); 你好布鲁诺。当我将 m_* 值分配给某个属性时(例如,当我设置按钮的文本颜色 --> this.Button1.ForeColor = m_TextButtonColor),在 InitializeComponent 方法内部产生错误 也在这里讨论过:***.com/questions/1915183/… 这里还有:***.com/questions/12342760/… 由于不确定发生了什么,我无法写出答案,并且正在尝试解决一个可能不同但可能不相关的问题,但正在尝试我的主要解决方案和一个小型 hackjob 自定义控制项目,我发现我必须选择“任何 CPU”而不是 x86 或 x64 以避免出现这些“变量未声明”错误。 【参考方案1】:

所以,我过去也遇到过同样的问题,为了解决问题,我做了以下操作:

解决方案 → 清洁解决方案; 构建 → 重建解决方案; 关闭 Visual Studio,重新打开。

非常感谢Marshall Belew!

【讨论】:

我可以做到这一点,并且它有效,但我想知道为什么会发生这个错误以及如何避免这种情况。或者这只是一个简单的 VS 错误? 如果有人在这里找到他们的方式,问题可能是由于违规控件的构造函数被声明为public以外的任何内容。【参考方案2】:

就我而言,我有一个较旧的 Windows 窗体项目,其中 InitializeComponents() 是这样开始的:

private void InitializeComponent()

    var componentResourceManager = new ComponentResourceManager(typeof(MyForm));
    ...

这导致稍后在访问 componentResourceManager 内的 InitializeComponent() 时出现错误消息:

变量“componentResourceManager”要么未声明,要么从未赋值。

与新创建的表单比较时,我发现它与我的非工作表单相似,除了一件事:

该变量未命名为 componentResourceManager,而只是命名为 resources

解决方案

在我的变量重命名为 resources 后,一切正常:

private void InitializeComponent()

    var resources = new ComponentResourceManager(typeof(MyForm));
    ...

Visual Studio 2017 中的 Windows 窗体设计器确实正确打开了窗体。

【讨论】:

谢谢,为我工作。你能解释一下为什么会这样吗? 太棒了!这也对我有用。有人可以解释一下为什么更改为resources 有效吗?【参考方案3】:

我遇到了这个错误,因为我的项目只有 x64。显然,作为 32 位应用程序的 Visual Studio 无法在设计器中加载编译为 64 位的任何表单或控件。这是完全有道理的,但该错误不会告诉您这是问题所在。

请参阅 the answer 至 Visual studio designer in x64 doesn't work。

解决方法是在设计时将项目更改为 Any CPU,然后在构建时返回。

【讨论】:

太糟糕了,即使在 Visual Studio 2017 中,他们仍然没有说出真正的原因......在尝试手动更改 GUI 之后,在网上 2 小时......直到我来到这里。 ..【参考方案4】:

可能由于您的构造函数代码而发生错误。将InitializeComponent(); 放在构造函数的开头,如下所示:

public FormularioGeneral()     
         
    InitializeComponent();
    ConfigurarUI();         
    AccionesConstructor();
    PostInicializacionComponentes();         
    EstablecerIcono();         
    InicializarLocalizacionFormulario();     
 

说明:

在该方法中初始化变量。

【讨论】:

我已经试过了,但这并不能解决问题。无论如何,变量被声明为没有值。在“ConfigurarUI”方法中分配了一个值(所以这个方法应该在使用变量之前执行)。最后,在 InitializeComponent 中使用了变量。 据我正确理解,您是否更改了InitializeComponent 中的代码以使用您的变量? 我不认为这些分配是在 InitializeComponent 中“硬编码”的,因为它是在您每次编译时自动生成的。我假设这些值是通过设计师分配的,但由于其他人启动了这个项目并且我是“继任者”,因此无法保证:P 可怜的“继任者”。设计器不会生成开头带有“m_”的成员变量。所以这是“手工制作”的,它会制造麻烦。 “InitializeComponents”方法有一条评论,指出永远不要编辑它。尝试以不同的方式解决问题,可能通过在 InitializeComponents 之后设置值。 我知道 m_* 变量是手动创建的,但我认为你是对的。错误指向在 InitializeComponent 内部进行的分配,例如“this.Button1.ForeColor = m_TextButtonColor”,这应该通过设计器进行,并且似乎是硬编码的。我将尝试将那些硬编码的分配更改为这个:“this.Button1.ForeColor = Color.Black”,这是存储在 m_TextButtonColor 中的值:P【参考方案5】:

我遇到了同样的问题,清洁和重建对我不起作用。

在我的情况下,问题是由 Visual Studio 设计器从 GAC 加载引用的 DLL 而不是从 .csproj 文件中指定的 目录加载它们引起的。 GAC 中的 DLL 与本地存储的 DLL 版本不同。

当我将 GAC 中的 DLL 更新为具有相同版本时,一切都再次正常。

【讨论】:

【参考方案6】:

当我的用户控件在构造函数中有一些与运行时资源相关的代码时,我遇到了这个问题。我添加了空检查并修复了它。

        InitializeComponent();
        if (MyConfig!= null)
        
            this.label2.Text = MyConfig.text1;
            this.label3.Text = MyConfig.text2;
            this.label1.Text = MyConfig.text3;
        

【讨论】:

【参考方案7】:

在我的例子中,我在我的工具栏中添加了一个第三方控件(通过一个 .dll 文件),并在我的表单中绘制了一个。并且由于某种原因,我的工具栏将这个第三方控件从常规组中清除(我将它添加到常规组中),所以 VS 找不到这个控件。 这是我为解决这个问题所做的:

    将此控件添加到工具栏中。 清洁溶液 重建解决方案

必要时重绘控件。

【讨论】:

【参考方案8】:

除了InitializeComponent(); 之外,不要在构造函数中添加任何内容。您可以将那里的代码放入 Load() 等事件中。

【讨论】:

【参考方案9】:

用户控件出现问题,在尝试了所有建议后,(关注解决方案,然后 Alt+Enter)将解决方案的 Platform Targetx64 更改为任何 CPU 都可以解决问题。

【讨论】:

【参考方案10】:

关于变量,你可以简单地在声明中初始化它们吗?我认为这就足够了,即使您稍后更改该值。据我所见,编译器无法检查您是否已初始化它们,因为它不是直接在构造函数代码上,它是在仅在运行时评估的虚拟方法上完成的。

所以,而不是:

protected Color m_VariableName;
public Color VariableName

    get  return m_VariableName; 
    set  

做:

protected Color m_VariableName = Color.White; // Or null
public Color VariableName

    get  return m_VariableName; 
    set  

还有一条评论:您应该避免在构造函数中进行虚拟调用,这可能会导致您的应用程序中出现难以理解的错误。检查它here。

【讨论】:

感谢您的回答。我试着按照你说的做,在声明中初始化变量,但没有解决问题:PI还阅读了虚拟方法,并复制了构造函数中虚拟方法中的所有代码,不需要进行调用,但即便如此,问题仍然存在:P【参考方案11】:

我在从表单构造函数调用的 InitializeComponent() 中创建第三方控件时发生此错误。当我在 InitializeComponent() 之后创建它时,它对我来说很好。

public MyForm() //Form constructor
         
    InitializeComponent();

    //Create/initialize third party control here with new operator    

【讨论】:

这正是我的问题,我创建了一些用户控件,并且由于某种原因,生成表单设计的过程总是抱怨。在我将任何看起来可疑的东西从 InitializeComponent 中移出后,它就可以正常工作了。谢谢【参考方案12】:

我正在 Windows 窗体中使用 WPF。

我在 Windows 窗体元素宿主中托管了我的 WPF 用户控件。由于调用 InitializeComponent() 时,我在到达 WPF 控件的 InitializeComponent() 之前执行了代码。棘手。

所以我将它从我的构造函数中移出,Clean Build、Rebuild、Restart VS,一切都按预期工作。最后。

【讨论】:

【参考方案13】:

我遇到了同样的问题,我已经解决了。实际上 Visual Studio 仅适用于 X86 控件,您无法在 X64 模式下创建用户控件并使用它。

您应该在 Any CPU 模式下添加一个新的类库并构建该类库。然后你可以在你的项目中添加它的DLL。完成。

如果不是,您必须转到配置管理器并将活动解决方案平台设置为 X64,也为所有子项目执行此操作。请记住,必须检查构建选项。并转到类库的属性并单击构建选项卡。然后将平台目标设置为 Any CPU。

【讨论】:

【参考方案14】:

首先,我的代码引用了设计人员无法加载的类型(无论出于何种原因)。然后我在构造函数中有无法从本地笔记本电脑执行的代码。我认为最好的选择是将逻辑移动到 Load 事件并检查组件是否处于设计模式,如果是则退出。

即使这对我来说还不够,因为设计师仍然试图 JIT 方法中后来出现的类型,所以我不得不将它移到一个单独的方法中以阻止这种情况发生。这基本上是我最终得到的结果:

    private void userControl_Load(object sender, EventArgs e)
    
        if (DesignMode) return;

        Initialize();
    

    private void Initialize()
    
        // do your work
    

特别感谢 this SO answer,它指出我在一篇博文中的评论是关于在 Load 事件中之前不要访问 DesignMode 属性...

【讨论】:

【参考方案15】:

将变量 componentResourceManager 重命名为资源解决错误。

不幸的是,我不得不更改大量其他项目才能让设计师为 Telerik 报告设计师工作

【讨论】:

【参考方案16】:

在我的解决方案中,我在 .csproj 文件中修复了错误的参考路径。修复后我终于可以再次加载表单了。

【讨论】:

以上是关于变量“variable_name”要么未声明,要么从未赋值的主要内容,如果未能解决你的问题,请参考以下文章

PHP 变量声明的意义

模型要么未安装,要么是抽象的 - Django、Python

钛的范围问题

Spring整合Mybatis框架-为业务层添加声明式事务控制 要么都成功要么都失败

rust加载国内服务器,要么是未响应,要么是自动关闭游戏

抽象类 接口 多态