繁体   English   中英

通过C#中的Action传递结构体无法编译

[英]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;

永远不会提出您引用的错误; 如果无法解析ActionstructName这两种类型中的任何一种,则会抱怨-如果通用类型参数不合适,则会抱怨,但这是预期的。

如果OnBlah是一个字段,它将自动初始化为null;否则,它将自动初始化为null。 如果是变量 ,则需要在使用前进行分配。 可以将其分配为null ,但是如果是这样,则在尝试调用它时会在运行时失败(除非您执行null检查)。 于是我们来调用; 如果我们假设非空,则需要提供一个参数,即

OnBlah(someValue); // or OnBlah.Invoke(someValue);

在这里,如果未定义 someValue ,则会出错; 如果未明确分配 ,它将出错。 对于确定的分配,将分配字段 除非初始化,否则不会变量。

在结构中的情况下,一个值是由使用构造(或返回值的另一种方法) 或者初始化, 通过手动设置场(这不应该是可能的,因为一个:结构应该是不可变的,和b:字段应为私有)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM