编译器错误取决于方法签名中的参数位置。使用未分配的局部变量

塔基翁

假设我有这个课程:

class Boo
{
    public override string ToString()
    {
        return "I am Boo!";
    }
}

和这些方法:

static int Foo(out Boo boo)
{
    boo = new Boo();
    return 1;
}
static void Lol(Boo boo, int n)
{
    Console.WriteLine(n);
    Console.WriteLine(boo);
}

现在在Main:

static void Main(string[] args)
{
    Boo boo;
    Lol(boo, Foo(out boo));
    Console.ReadLine();
}

这会产生编译错误:使用未分配的局部变量'boo'首先,我了解为什么会发生这种情况,我可以通过添加以下内容进行修复:

Boo boo = null;

然后,在我的Lol方法中,尽管Foo首先执行,但是boo仍然为null 然后,如果我修改代码以像这样使用ref

Lol(ref boo, Foo(out boo));
static void Lol(ref Boo boo, int n)
{
    Console.WriteLine(n);
    Console.WriteLine(boo);
}

知道我是Boo!如预期的那样。我不明白的是为什么如果我在Lol中更改参数的顺序并且不使用ref而不初始化boo这样的原因:

static void Lol(int n, Boo boo) //order of the parameters has changed
{
    Console.WriteLine(n);
    Console.WriteLine(boo);
}

Lol(Foo(out boo), boo);

这样就不会产生任何编译错误,而且除了我收到“我是Boo!”外,如预期的那样。

在调试时,我注意到在两种情况下(将int参数作为第一个参数,而将另一种方法作为参数)Foo首先执行。那么为什么编译器会显示此错误?

雷内·沃格特(Rene Vogt)

编译器从左到右评估参数表达式。所以在这一行:

Boo boo = null;
Lol(boo,Foo(out boo));

(不带refboo首先被求值(结果为null),然后将此结果null)作为的参数放到堆栈中Lol

然后Foo(out boo)执行,该操作将设置您的局部boo变量的值,但不会更改已在堆栈上的值Lol


使用对本地变量ref引用boo放在堆栈上,因此Lol将读取更改的值Foo


更改参数顺序时,Foo(out boo)先评估/执行,然后boo初始化,然后将其值放入的堆栈中Lol

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

编译器错误地指示使用未分配的局部变量错误

来自分类Dev

为什么编译器会引发错误CS0165:使用未分配的局部变量?

来自分类Dev

是否可以为未分配的局部变量保证CS0165 C#编译器错误?

来自分类Dev

错误“使用未分配的局部变量”?

来自分类Dev

C#编译器-未分配的字段和局部变量初始值

来自分类Dev

使用未分配的参数编译器错误,用于从函数输出参数接收的变量吗?

来自分类Dev

抑制“使用未分配的局部变量”错误?

来自分类Dev

LINQ,输出参数和“未分配的局部变量的使用”错误

来自分类Dev

使用未分配的局部变量“ x”

来自分类Dev

使用未分配的局部变量“ strCity”

来自分类Dev

使用未分配的局部变量“ SHELLEXECUTEINFO”

来自分类Dev

使用未分配的局部变量数组

来自分类Dev

使用未分配的局部变量“ folderPath”

来自分类Dev

使用未分配的局部变量“书”

来自分类Linux

使用局部变量的编译器,无需调整RSP

来自分类Dev

为什么try / finalize块不会抛出CS0165:使用未分配的局部变量编译错误?

来自分类Dev

使用已分配的未分配局部变量

来自分类Dev

将未分配的局部变量错误用于货币转换器?对不起

来自分类Dev

奇异的Arduino C ++编译错误取决于文件位置

来自分类Dev

Java编译器如何在局部变量表中分配索引?

来自分类Dev

使用foreach循环时使用未分配的局部变量

来自分类Dev

使用异步/等待时使用未分配的局部变量

来自分类Dev

错误在C#中使用未分配的局部变量(开关)

来自分类Dev

“使用未分配的局部变量”错误的原因是什么?

来自分类Dev

错误 CS0165 使用未分配的局部变量“json”

来自分类Dev

在foreach循环中出现“使用未分配的局部变量”错误,并返回收益

来自分类Dev

C#使用未分配的局部变量

来自分类Dev

在finally块上使用未分配的局部变量

来自分类Dev

C#Winform使用未分配的局部变量

Related 相关文章

  1. 1

    编译器错误地指示使用未分配的局部变量错误

  2. 2

    为什么编译器会引发错误CS0165:使用未分配的局部变量?

  3. 3

    是否可以为未分配的局部变量保证CS0165 C#编译器错误?

  4. 4

    错误“使用未分配的局部变量”?

  5. 5

    C#编译器-未分配的字段和局部变量初始值

  6. 6

    使用未分配的参数编译器错误,用于从函数输出参数接收的变量吗?

  7. 7

    抑制“使用未分配的局部变量”错误?

  8. 8

    LINQ,输出参数和“未分配的局部变量的使用”错误

  9. 9

    使用未分配的局部变量“ x”

  10. 10

    使用未分配的局部变量“ strCity”

  11. 11

    使用未分配的局部变量“ SHELLEXECUTEINFO”

  12. 12

    使用未分配的局部变量数组

  13. 13

    使用未分配的局部变量“ folderPath”

  14. 14

    使用未分配的局部变量“书”

  15. 15

    使用局部变量的编译器,无需调整RSP

  16. 16

    为什么try / finalize块不会抛出CS0165:使用未分配的局部变量编译错误?

  17. 17

    使用已分配的未分配局部变量

  18. 18

    将未分配的局部变量错误用于货币转换器?对不起

  19. 19

    奇异的Arduino C ++编译错误取决于文件位置

  20. 20

    Java编译器如何在局部变量表中分配索引?

  21. 21

    使用foreach循环时使用未分配的局部变量

  22. 22

    使用异步/等待时使用未分配的局部变量

  23. 23

    错误在C#中使用未分配的局部变量(开关)

  24. 24

    “使用未分配的局部变量”错误的原因是什么?

  25. 25

    错误 CS0165 使用未分配的局部变量“json”

  26. 26

    在foreach循环中出现“使用未分配的局部变量”错误,并返回收益

  27. 27

    C#使用未分配的局部变量

  28. 28

    在finally块上使用未分配的局部变量

  29. 29

    C#Winform使用未分配的局部变量

热门标签

归档