【发布时间】:2018-09-03 18:59:27
【问题描述】:
为什么这个程序使用seq会报错:
class Program
{
delegate double Sequence(int r);
void F(ref Sequence seq) // Here
{
Sequence seq2 = r =>
{
if (r % 2 == 0)
return seq(r); // Here
else
return seq(2 * r); // Here
};
seq = seq2;
}
static void Main()
{
}
}
错误 CS1628 不能使用 ref、out 或 in 参数 'seq' 在一个 匿名方法、lambda 表达式、查询表达式或本地 函数 CsharpRefLambdaTest
问题在于参数seq 是一个引用类型。但是为什么错了?参考seq 有什么问题?如果seq 未被引用,则程序没有错误。
有什么办法可以在保留seq作为参考的同时更正程序吗?
该程序只是一个测试,它不会做任何事情。
=================
我需要使用seq的值来定义一个新的序列seq2,然后分配seq = seq2。但是 seq 的值是不可用的。如果seq 的值不可用,为什么C# 允许seq 作为引用?
=================================
编辑:
上面的程序只是下面的简化版:
class Program
{
delegate double Sequence(int r);
Sequence G(Sequence seq)
{
Sequence seq2 = r =>
{
if (r % 2 == 0)
return seq(r);
else
return seq(2 * r);
};
return seq2;
}
void F(ref Sequence seq)
{
seq = G(seq);
}
static void Main()
{
}
}
但我不明白为什么我不能删除G,而是添加G insideF`的定义代码。
【问题讨论】:
-
你的问题与参考types无关;问题是
ref参数。你不需要那个;不要使用它。 -
@SLaks 这是一个简化的程序。实际上我要在 F 中更改 seq。但是错误阻止了。
-
@nano 如果这是你想要的,最好return组合的 lambda - 即
Sequence F(Sequence seq) { ... }和return -
您需要将其包装在可以携带它的东西中,然后将其作为属性添加到携带类型中,该类型只是为了在方法调用之间携带值而存在,并允许此属性有一个setter,那么它可以被改变。如错误所示,您不能像这样将
ref与本地函数或委托一起使用。 -
@LasseVågsætherKarlsen 或干脆
returnit :)