C# 在C语言中,为什么在这种情况下局部变量的名称会冲突?

C# 在C语言中,为什么在这种情况下局部变量的名称会冲突?,c#,scope,C#,Scope,我有一段类似的代码 public string GetMessage() { if (new Random().Next(10) % 2 == 0 == 0) { string message = "bad luck"; return message; } string message = "lucky"; return message; } 这段代码当然可以改进,但让我困惑的是,

我有一段类似的代码

public string GetMessage()
{
    if (new Random().Next(10) % 2 == 0 == 0)
    {
        string message = "bad luck";
        return message;
    }

    string message = "lucky";
    return message;
}
这段代码当然可以改进,但让我困惑的是,它意外地产生了错误

A local or parameter named 'message' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter
现在奇怪的是,更小范围内的变量甚至不应该存在以引起冲突。这在C中是合法的:

char* GetMessage()
{
    if (rand() % 2 == 0)
    {
        char* message = "bad luck";
        return message;
    }

    char* message = "lucky";
    return message;
}

这是编译和工作。一旦较小的范围结束,其中的变量就不再存在,我可以自由地重用这个名称。类似的代码也适用于Swift,那么为什么C中的代码不同呢?

在C中,在块中声明的任何变量都将在声明它们的整个块中保持作用域。这意味着,如果在if/else块中声明变量,则不能在同一方法块中声明下面具有相同名称的变量,因为C将看到它已经存在


在我看来,如果您想查看的话,可以很好地解释C中的变量范围。

您在C示例中运气不错。在c语言中,我们期望消息的存储在返回后超出范围:但返回的指针指向消息值原来所在的位置。要更正c,请声明并定义一个具有足够空间的局部变量,以获取调用函数中最长的消息。将指向该空间的指针传递给函数,而不是返回悬空指针。作为旁注:在生产代码中,您的c代码可能工作数年,然后意外地显示间歇性故障。请查看c和c中的范围规则。

这是否回答了您的问题?为什么您希望C采用或共享其他语言的作用域和变量命名规则?C不是C,也不是Swift,那么为什么它们会影响或与C错误相关呢?此外,double==0==0将无法编译。当使用else语句时会发生什么情况?部分正确。这与范围界定有关,但与此相反。块中定义的变量在此块和所有封闭范围中可见,但反之亦然。因此,if块体中的消息在方法的作用域中不可见,但方法体中的消息在if块中可见,即使它在下面几行定义,但这在C中并不重要。因此错误指向if中的消息变量,而不是方法体中的消息变量。啊,好的,这是有道理的。谢谢你纠正我!