C# 在参数列表中声明变量

C# 在参数列表中声明变量,c#,declare,C#,Declare,在c#7中,可以为参数列表中的out变量声明变量: if (int.TryParse(input, out int result)) WriteLine(result); 是否可以在参数列表中声明(“非out”)变量?像这样: if (!string.IsNullOrEmpty(string result=FuncGetStr())) WriteLine(result); 您可以在语句中分配变量,但是变量的声明应该在语句之外完成。您不能将它们组合(外部out和模式匹配

在c#7中,可以为参数列表中的
out
变量声明变量:

if (int.TryParse(input, out int result))
    WriteLine(result);
是否可以在参数列表中声明(“非out”)变量?像这样:

if (!string.IsNullOrEmpty(string result=FuncGetStr()))
        WriteLine(result);
您可以在语句中分配变量,但是变量的声明应该在语句之外完成。您不能将它们组合(外部
out
和模式匹配,正如您在问题中已经指出的)

关于为什么这种行为不同于使用
out
,等等,他的评论可能很有趣:


内联声明
out
变量的能力来自于这样一种尴尬:a)必须是变量而不是值;b)如果在调用函数之前声明值,则通常与值无关。我看不到其他类似用途的相同动机


你不能在参数列表中这样做,不

您可以使用模式匹配进行此操作,但我不建议:

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
    语句之后没有明确赋值
  • 如果
    FuncGetStr()
    返回null,则在第一个版本中甚至不会调用
    string.IsNullOrEmpty
    ,因为
    is
    模式不匹配。因此,你可以这样写:

    if (FuncGetStr() is string result && result != "")
    

非常可怕的是,您可以使用helper方法来使用
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();
}
//邪恶代码:不要使用
使用制度;
公开课考试
{
静态void Main(字符串[]参数)
{
如果(!string.IsNullOrEmpty(调用(FuncGetStr,out string result)))
{
控制台写入线(结果);
}
}
静态字符串FuncGetStr()=>“foo”;
静态T调用(Func-Func,out T x)=>x=Func();
}

您试过了吗?行得通吗?@m.rogalski我试过了,不行,但是可能是我的语法错了,这是有可能的?也许在c#7更改注释中查找而不是问这样的问题更有用吗?内联声明
out
变量的能力是因为它a)必须是一个变量而不是一个值,b)通常与值无关如果在调用函数之前声明它。我看不到其他类似用途的相同动机。我认为这是不可能的,你证明了这一点。“你不能将它们结合起来”-嗯,除了模式匹配和输出变量…是的,但这意味着你的答案似乎与问题相矛盾,因为你没有对你的陈述施加任何限制。啊,好的。澄清。你说的“大致相当”是对的。我想把它缩短一些;)“易于阅读”-基于意见;)@Rekshino:虽然可读性在某种程度上是主观的,但我怀疑是否有许多C#开发者会真正发现第一种形式更易于阅读。哦,还有第二个区别我没有提到-第一个表单不调用
string.IsNullOrEmpty
如果
FuncGetStr()
返回null。(编辑)我绝对认为值得承认的是,“更短”和“更具可读性”可能非常非常不同。完全同意“更短”和“更具可读性”可能非常非常不同。@Rekshino:我在底部添加了一段可怕的代码,让您使用
out
参数。显然你不应该这样做。“非常可怕”!:)+1.
// 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();
}