我有一个非常简单的问题。 我为你演示了一个非常简单的功能。
static void Main(string[] args)
{
double[,] mydouble = new double[1, 4];
mynewMatrix(out mydouble);
}
public static void mynewMatrix(out double[,] d)
{
for (int i = 0; i < 4; i++)
d[0, i] = i;
}
错误:
使用未分配的输出参数'newMAt'输出参数'newMAt' 必须在控制离开当前方法之前分配给
我不知道问题出在哪里。
答案 0 :(得分:82)
如果数组是在函数的OUTSIDE中定义的,那么你应该使用ref
(或者没有,考虑到数组是引用类型)。 out
表示参数将在返回之前在函数中初始化。一些使用示例:
static void Main(string[] args)
{
double[,] mydouble;
mynewMatrix(out mydouble);// call of method
double[,] mydouble2 = new double[1, 4];
mynewMatrix2(mydouble2);// call of method
// useless for what you want to do
mynewMatrix3(ref mydouble2);// call of method
}
public static void mynewMatrix(out double[,] d)
{
d = new double[1, 4];
for (int i = 0; i < 4; i++)
{
d[0, i] = i;
}
}
public static void mynewMatrix2(double[,] d)
{
for (int i = 0; i < 4; i++)
{
d[0, i] = i;
}
}
// useless for what you want to do
public static void mynewMatrix3(ref double[,] d)
{
for (int i = 0; i < 4; i++)
{
d[0, i] = i;
}
}
我想补充一点,如果你不知道ref
和out
之间有什么区别,你可以阅读Difference between ref and out parameters in .NET
答案 1 :(得分:19)
在c#中有两个非常相似的关键字ref
和out
。
它们都通过引用传递值,但区别在于:
使用ref
时,编译器会要求您在调用方法之前分配变量。
使用out
时,不需要这样做。这意味着您将无法假定参数已经填充。您将无法在方法中读取其值。
为了说明问题,想象一下如果其他人编写此代码来调用您的方法会发生什么:
double[,] myUnassignedDouble;
mynewMatrix(out myUnassignedDouble);
显然,永远不会分配变量,这很糟糕。
这为您提供了三个选项:
void mynewMatrix(ref double[,] d)
void mynewMatrix(out double[,] d)
void mynewMatrix(double[,] d)
第三个选项可以正常工作,因为到目前为止你还没有需要重新分配你的变量。显然,随着代码变得更加复杂,可能会发生变化。我假设您确实有理由首先使用out
?
答案 2 :(得分:4)
错误消息是明确的 - 您需要为方法中的out参数指定一个值:
public static void mynewMatrix(out double[,] d)
{
d = new double[1, 4];
for (int i = 0; i < 4; i++)
{
d[0,i]=i;
}
}
您在方法之外进行的分配无效。写下这个:
static void Main(string[] args)
{
double[,] mydouble;
mynewMatrix(out mydouble);
}
答案 3 :(得分:1)
您正在为数组参数的元素赋值,但您必须将y值赋给数组本身,因为它定义为out
:
d = new double[1, 4];