为什么我在 C# 中出现这些参数错误

本文关键字:参数 错误 为什么 | 更新日期: 2023-09-27 18:33:19

我是C#的新手。我已经在 C# 中使用 out 参数尝试过这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class First
{
    public void fun(out int m)
    {
        m *= 10;
        Console.WriteLine("value of m = " + m);
    }
}
class Program
{
    static void Main(string[] args)
    {
        First f = new First();
        int x = 30;
        f.fun(out x);
    }
}

但是我收到一些错误,例如"使用未分配的参数'm'"
在控件离开当前方法之前,必须将 out 参数 'm' 分配给 out。

那么这些错误的含义是什么,以及为什么当我已经被分配给 x 的值时必须分配"m"。

为什么我在 C# 中出现这些参数错误

>ref表示在调用该方法之前传递对已声明和初始化的变量的引用,并且该方法可以修改该变量的值。

out 表示在调用方法之前传递对已声明但尚未初始化的变量的引用,并且该方法必须在返回之前初始化或设置其值。

您收到错误,因为作为out参数发送到方法的变量不必在方法调用之前进行初始化。以下是 100% 正确的代码:

class Program
{
    static void Main(string[] args)
    {
        First f = new First();
        int x;
        f.fun(out x);
    }
}

看起来您正在寻找ref而不是out

class First
{
    public void fun(ref int m)
    {
        m *= 10;
        Console.WriteLine("value of m = " + m);
    }
}
class Program
{
    static void Main(string[] args)
    {
        First f = new First();
        int x = 30;
        f.fun(ref x);
    }
}

out参数用于函数想要从自身传递值的情况。您在这里想要的是 ref ,这是函数期望传入它,但可以更改它的时候。

有关如何使用两者的示例,请阅读 http://www.dotnetperls.com/parameter。它用简单的术语解释,你应该能够很好地理解它。

您应该注意,在代码中,在函数调用后永远不会访问变量,因此ref实际上不会执行任何操作。其目的是将更改发送回原始变量。

从 C# 7.0 开始,引入了在变量作为 out 参数传递时声明变量 right 的功能。

以前:

public void PrintCoordinates(Point p)
{
    int x, y; // have to "predeclare"
    p.GetCoordinates(out x, out y);
    WriteLine($"({x}, {y})");
}

C# 7.0

public void PrintCoordinates(Point p)
{
    p.GetCoordinates(out int x, out int y);
    WriteLine($"({x}, {y})");
}

您甚至可以使用 var 关键字:

p.GetCoordinates(out var x, out var y);

小心 out 参数的范围。例如,在下面的代码中,"i"仅在 if 语句中使用:

public void PrintStars(string s)
{
    if (int.TryParse(s, out var i)) { WriteLine(new string('*', i)); }
    else { WriteLine("Cloudy - no stars tonight!"); }
}

更多信息可以在这里找到。此链接不仅涉及 out 参数,还涉及 c# 7.0<</strong>div class="answers" 中引入的所有新功能

>
public void Ref_Test(ref int x)
{
    var y = x; // ok
    x = 10;
}
// x is treated as an unitialized variable
public void Out_Test(out int x)
{
    var y = x; // not ok (will not compile)
}
public void Out_Test2(out int x)
{
    x = 10;
    var y = x; // ok because x is initialized in the line above
}