变量“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 更新为具有相同版本时,一切都再次正常。
【讨论】:
【参考方案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 Target 从 x64 更改为任何 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”要么未声明,要么从未赋值的主要内容,如果未能解决你的问题,请参考以下文章
模型要么未安装,要么是抽象的 - Django、Python