在c#7中可以为参数列表中的out
变量声明变量:
if (int.TryParse(input, out int result))
WriteLine(result);
是否可以在参数列表中声明("非out")变量?像这样:
if (!string.IsNullOrEmpty(string result=FuncGetStr()))
WriteLine(result);
答案 0 :(得分:3)
你不能在参数列表中这样做,没有。
你可以使用模式匹配,但我不建议:
if (FuncGetStr() is string result && !string.IsNullOrEmpty(result))
这使声明保持在if
的源代码中,但result
的范围仍然是封闭的块,所以我认为分离出来会简单得多:
// Mostly equivalent, and easier to read
string result = FuncGetStr();
if (!string.IsNullOrEmpty(result))
{
...
}
我能想到两个不同之处:
result
未在第一个版本中的if
语句后明确分配string.IsNullOrEmpty
返回null,则 FuncGetStr()
甚至不会在第一个版本中调用,因为is
模式不匹配。您可以因此将其写为:
if (FuncGetStr() is string result && result != "")
完全可怕,你可以这样做,使用帮助方法让你使用out
参数。这是一个完整的例子。请注意,我不建议这样做。
// EVIL CODE: DO NOT USE
using System;
public class Test
{
static void Main(string[] args)
{
if (!string.IsNullOrEmpty(Call(FuncGetStr, out string result)))
{
Console.WriteLine(result);
}
}
static string FuncGetStr() => "foo";
static T Call<T>(Func<T> func, out T x) => x = func();
}
答案 1 :(得分:0)
您可以在语句中分配变量,但变量的声明应该在它们之外完成。您无法将它们组合在一起(在out
之外和模式匹配,正如您在问题中已经指出的那样)。
bool b;
string a;
if (b = string.IsNullOrEmpty(a = "a")){ }
在为什么这种行为与out
等不同的情况下,Damien_The_Unbeliever的评论可能很有趣:
内联声明
out
变量的能力来自于a)必须是变量而不是价值的尴尬b)如果你经常没有什么对这个值有用的话在调用函数之前声明它。我没有看到其他此类用途的相同动机。