关于C#:变量”variable_name”未声明或从未分配

The variable 'variable_name' is either undeclared or was never assigned

我有一个关于标题错误的问题。我正在与C和Visual Studio 2010合作。

我有一个声明为"public class formurigeneral:form"的表单,它是我申请中其余表单的基础。当我尝试访问设计器视图时,会多次出现此错误,如图中所示:

Sample of errors所有错误都引用了InitializeComponent方法中的行,在该方法中,值被分配给类似以下属性:

1
2
3
[...]            
this.PanelMargenIzquierdoCapaBase.BackColor = m_ColorCapaBase;
[...]

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

财产声明:

1
2
3
4
5
6
    protected Color m_VariableName;
    public Color VariableName
    {
        get { return m_VariableName; }
        set { }
    }

构造函数代码:

1
2
3
4
5
6
7
8
9
    public FormularioGeneral()
    {
        ConfigurarUI();
        AccionesConstructor();
        InitializeComponent();
        PostInicializacionComponentes();
        EstablecerIcono();
        InicializarLocalizacionFormulario();
    }

配置方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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函数之前,所有给出错误的变量都被正确地声明并赋值。

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


因此,我在过去也遇到过同样的问题,为了解决这个问题,我做了以下工作:

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

非常感谢马歇尔·贝勒!


我遇到此错误,因为我的项目仅为x64。显然,Visual Studio是32位应用程序,无法在设计器中加载编译为64位的任何窗体或控件。这完全有道理,但这个错误并不能说明问题出在哪里。

请参见对x64中的Visual Studio设计器的回答。

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


可能是由于您的构造函数代码导致的错误。将EDOCX1[0]放在构造函数的开头,如下所示:

1
2
3
4
5
6
7
8
9
public FormularioGeneral()    
{        
    InitializeComponent();
    ConfigurarUI();        
    AccionesConstructor();
    PostInicializacionComponentes();        
    EstablecerIcono();        
    InicializarLocalizacionFormulario();    
}

说明:

变量在该方法中初始化。


在我的例子中,我有一个旧的windows窗体项目,其中InitializeComponents()是这样开始的:

1
2
3
4
private void InitializeComponent()
{
    var componentResourceManager = new ComponentResourceManager(typeof(MyForm));
    ...

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

The variable 'componentResourceManager' is either undeclared or was never assigned.

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

变量的名称不是componentResourceManager,而是简单的resources

解决方案

在对我的变量进行重命名以使其名称为resources之后,一切都成功地工作了。

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


我也有同样的问题,清洁和重建对我来说不起作用。

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

当我更新了GAC中的DLL以获得相同的版本时,一切都再次正常工作。


用户控件出现问题,在尝试了所有建议之后,(焦点解决方案,然后alt+enter)将解决方案的平台目标从x64更改为任何CPU,解决了问题。


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

1
2
3
4
5
6
7
        InitializeComponent();
        if (MyConfig!= null)
        {
            this.label2.Text = MyConfig.text1;
            this.label3.Text = MyConfig.text2;
            this.label1.Text = MyConfig.text3;
        }

不要在构造函数中放置除InitializeComponent();以外的任何内容。您可以将代码放在类似于Load()的事件中。


在我的示例中,我在工具栏中添加了第三方控件(通过.dll文件),并在窗体中绘制了一个控件。出于某种原因,我的工具栏将此第三方控件从常规组中清除(我将其添加到常规组中),因此VS找不到此控件。下面是我为解决这个问题所做的:

  • 将此控件添加到工具栏中。
  • 清洗溶液
  • 重建解决方案
  • 必要时重新绘制控件。


    我正在Windows窗体内使用WPF。

    我在Windows窗体元素宿主中承载了我的WPF用户控件。因此,当调用initializecomponent()时,我在到达wpf控件的initializecomponent()之前执行了代码。狡猾的

    所以我把它移出了我的构造函数,清理构建、重建、重新启动VS,一切都按预期工作。最后。


    在从窗体构造函数调用的InitializeComponent()中创建第三方控件时,出现此错误。当我在初始化组件()后创建它时,它对我来说很好。

    1
    2
    3
    4
    5
    6
    public MyForm() //Form constructor
    {        
        InitializeComponent();

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


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

    因此,而不是:

    1
    2
    3
    4
    5
    6
    protected Color m_VariableName;
    public Color VariableName
    {
        get { return m_VariableName; }
        set { }
    }

    做:

    1
    2
    3
    4
    5
    6
    protected Color m_VariableName = Color.White; // Or null
    public Color VariableName
    {
        get { return m_VariableName; }
        set { }
    }

    注释:您应该避免在构造函数中进行虚拟调用,这会导致应用程序中出现模糊的错误。在这里检查一下。


    首先,我有一些代码引用了设计器无法加载的类型(无论出于什么原因)。然后我在构造器中有无法从本地笔记本执行的代码。我决定最好的选择是将逻辑转移到加载事件,并检查组件是否处于设计模式,如果处于设计模式,则退出。

    即使这对我来说还不够,因为设计者仍然试图对方法中稍后出现的类型进行JIT,所以我不得不将它移到一个单独的方法中,以防止这种情况发生。以下是我最后得出的结论:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        private void userControl_Load(object sender, EventArgs e)
        {
            if (DesignMode) return;

            Initialize();
        }

        private void Initialize()
        {
            // do your work
        }

    特别要感谢这个"所以回答",它在一篇博客文章中给了我一条评论,告诉我在加载事件之前不要访问DesignMode属性…