[英]Passing a struct via an Action in C# does not compile
我有一个可以正常工作和编译的代码,其中的Action定义为:
Action<double, double, double ....> OnBlah;
现在我有16个以上的参数,因此我想传递一个结构,因此将操作定义为:
Action<structName> OnBlah;
但是我在C#编译器中收到一条错误消息,提示未初始化structName。 这很奇怪,因为:
答:以前在代码中,我直接从结构传递了OnBlah的double参数。
B.结构通过定义初始化。
我正在使用VS 2010,我猜这是编译器错误吗?
为编译器错误添加了复制代码:
namespace CompilerBug
{
struct Test
{
public double a;
}
class Program
{
static Action<Test> OnBlah;
static void DoesCompileOk()
{
Test test;
test.a = 5;
OnBlah(test);
}
static void DoesNotCompileOk()
{
Test test;
int b = 0;
if (b == 4)
{
test.a = 5;
}
OnBlah(test);
}
static void Main(string[] args)
{
OnBlah = (t) => { };
}
}
}
这不是编译器错误。 您需要先初始化结构,如编译器所说。 大概您的错误实际上在调用委托的代码中,因为没有其他意义。
当您使用16参数double版本调用委托时,double参数已初始化。 如果尚未初始化它们,则编译器将发出相同的错误。 例如:
private static void actDouble(double d)
{
}
static void Main(string[] args)
{
double d;
Action<double> act = actDouble;
act(d);//error on this line
}
无法编译,并出现以下错误:
error CS0165: Use of unassigned local variable 'd'
在这方面,结构没有什么特别的。
通常,遇到语法错误时,您的第一个猜测永远不应是这是编译器错误。 编译器错误极为罕见,尤其是在像这样广泛使用的编译器中。
在对添加了真实代码的问题进行编辑之后进行更新
Test test;
int b = 0;
if (b == 4)
{
test.a = 5;
}
OnBlah(test);
编译器不确定test
是否已完全初始化。 它不执行程序流分析。 您可以通过确保编译器知道该结构已完全初始化来解决此问题。
Action<structName> OnBlah;
永远不会提出您引用的错误; 如果无法解析Action
或structName
这两种类型中的任何一种,则会抱怨-如果通用类型参数不合适,则会抱怨,但这是预期的。
如果OnBlah
是一个字段,它将自动初始化为null;否则,它将自动初始化为null。 如果是变量 ,则需要在使用前进行分配。 可以将其分配为null
,但是如果是这样,则在尝试调用它时会在运行时失败(除非您执行null检查)。 于是我们来调用; 如果我们假设非空,则需要提供一个参数,即
OnBlah(someValue); // or OnBlah.Invoke(someValue);
在这里,如果未定义 someValue
,则会出错; 如果未明确分配 ,它将出错。 对于确定的分配,将分配字段 。 除非初始化,否则不会变量。
在结构中的情况下,一个值是由使用构造(或返回值的另一种方法) 或者初始化, 或通过手动设置每场(这不应该是可能的,因为一个:结构应该是不可变的,和b:字段应为私有)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.