在C#中,可以在单个语句中进行赋值和参数传递吗?

Law*_*Teo 1 c#

我想做

        string answer = (5 + 6).ToString();
        Console.WriteLine(answer);
Run Code Online (Sandbox Code Playgroud)

我想知道赋值和参数传递是否可以在C#的单个语句中同时发生.编译器不喜欢以下代码.

        Console.WriteLine(string answer = (5 + 6).ToString());
Run Code Online (Sandbox Code Playgroud)

Joe*_*orn 8

我想知道赋值和参数传递是否可以在C#的单个语句中同时发生.

他们可以,但变量声明不能.此代码不合法​​:

Console.WriteLine(string answer = (5 + 6).ToString());
Run Code Online (Sandbox Code Playgroud)

但这段代码是合法的:

string answer;
Console.WriteLine(answer = (5 + 6).ToString());
Run Code Online (Sandbox Code Playgroud)

并且由于分配chainging,它将输出值11.但它可能不是您可以使用的最佳编码风格.首先,我会这样写:

string answer = (5 + 6).ToString();
Console.WriteLine(answer);
Run Code Online (Sandbox Code Playgroud)

将它视为"同时"也不是最佳选择.它们位于相同的C#语句中,但在编译时不会在同一个IL语句中,并且不是原子的.


Eya*_*sSH 5

编辑:没关系,我显然生锈了。查看另一个答案:C#中确实存在赋值表达式,但它们不能包含变量声明。

在 C# 中,赋值是一个语句,而不是一个表达式。非表达式的语句没有值(与 C++ 不同,在 C++ 中,赋值有一个值,即新分配的值)。这主要是为了避免出现诸如 之类的错误if (x=5) ...,因为x=5不能有值,所以该代码将无法构建。

如果您想声明赋值,然后使用,那么您就很不走运,因为声明不能用作表达式。

如果您只想分配使用,那么使用带有参数的函数ref就可以解决这个问题。

例子:

T AssignAndGet<T>(ref T variable, T result) {
    variable = result;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

可以用作:

string x;
Console.WriteLine(AssignAndGet(x, (5+3).ToString()));
Run Code Online (Sandbox Code Playgroud)