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

塔基翁

假设我有这个课程:

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

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

来自分类Dev

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

来自分类Dev

避免出现“使用未分配的局部变量”错误

来自分类Dev

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

来自分类Dev

使用未分配的局部变量LinqToLdap

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

为什么在未使用的局部变量上没有得到编译器错误?

来自分类Dev

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

来自分类Dev

对分配的字符串使用未分配的局部变量错误

来自分类Dev

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

来自分类Dev

在初始化后的事件定义中,为什么会出现错误18使用未分配的局部变量'beforeEvntDrawArg'

来自分类Dev

在初始化后的事件定义中,为什么会出现错误18使用未分配的局部变量'beforeEvntDrawArg'

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

“使用未分配的局部变量”错误C#,“同时”命令

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用从存储过程创建的未分配的局部变量(对象)

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

    避免出现“使用未分配的局部变量”错误

  5. 5

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

  6. 6

    使用未分配的局部变量LinqToLdap

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

    为什么在未使用的局部变量上没有得到编译器错误?

  13. 13

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

  14. 14

    对分配的字符串使用未分配的局部变量错误

  15. 15

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

  16. 16

    在初始化后的事件定义中,为什么会出现错误18使用未分配的局部变量'beforeEvntDrawArg'

  17. 17

    在初始化后的事件定义中,为什么会出现错误18使用未分配的局部变量'beforeEvntDrawArg'

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

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

  24. 24

    “使用未分配的局部变量”错误C#,“同时”命令

  25. 25

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

  26. 26

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

  27. 27

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

  28. 28

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

  29. 29

    使用从存储过程创建的未分配的局部变量(对象)

热门标签

归档