为什么我在 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"。
>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
}