C# 如何在C中将列表中的单个元素类型转换为计算中的类型“double”

C# 如何在C中将列表中的单个元素类型转换为计算中的类型“double”,c#,C#,假设我有一个初始化的列表:list o 我将执行以下操作: int offset = 10; for (int i = 0; i < o.Count; ++i){ o[i] = ApplyRamp(o[i]-offset) } 其中,ApplyRamp定义为: public static void ApplyRamp(ref double x) { if (x < 0) x = 0; } 但是代码不会编译。为什么列表中的单个元素,即o[i]不被视

假设我有一个初始化的列表:list o

我将执行以下操作:

 int offset = 10;

 for (int i = 0; i < o.Count; ++i){
     o[i] = ApplyRamp(o[i]-offset)
 }
其中,ApplyRamp定义为:

 public static void ApplyRamp(ref double x)
 {
     if (x < 0) x = 0;
 }

但是代码不会编译。为什么列表中的单个元素,即o[i]不被视为类型double?

这里有四个问题:

必须对参数和参数使用ref 表达式o[i]-offset被分类为一个值而不是一个变量,因此不能通过引用传递它 甚至表达式o[i]也会被归类为一个值,因为它是调用索引器的结果。如果o是一个double[],即数组而不是列表,那么o[i]将被分类为变量。 您试图将void方法的结果用作赋值运算符的右侧。void方法没有结果。 您可以使用:

double temp = o[i] - offset;
ApplyRamp(ref temp);
// Do something with temp?
但现在还不清楚你以后会怎么处理临时工。您正在尝试修改o吗?如果是这样的话,补偿从何而来?在这种情况下,你为什么也要分配给o[i]

最后,我强烈敦促你考虑让你的Apple YRAMP只使用一个正则值的参数,然后返回结果。这将使它在大多数情况下更易于使用。我很少看到在void方法中很好地使用ref参数

比如:

public static double ApplyRamp(double x)
{
    return x < 0 ? 0 : x;
}

这里有四个问题:

必须对参数和参数使用ref 表达式o[i]-offset被分类为一个值而不是一个变量,因此不能通过引用传递它 甚至表达式o[i]也会被归类为一个值,因为它是调用索引器的结果。如果o是一个double[],即数组而不是列表,那么o[i]将被分类为变量。 您试图将void方法的结果用作赋值运算符的右侧。void方法没有结果。 您可以使用:

double temp = o[i] - offset;
ApplyRamp(ref temp);
// Do something with temp?
但现在还不清楚你以后会怎么处理临时工。您正在尝试修改o吗?如果是这样的话,补偿从何而来?在这种情况下,你为什么也要分配给o[i]

最后,我强烈敦促你考虑让你的Apple YRAMP只使用一个正则值的参数,然后返回结果。这将使它在大多数情况下更易于使用。我很少看到在void方法中很好地使用ref参数

比如:

public static double ApplyRamp(double x)
{
    return x < 0 ? 0 : x;
}
您不能将void赋值给任何变量,我认为您应该更改方法的签名:

 public static double ApplyRamp(double x)
 {
     if (x < 0) return 0;
     return x;
 }
现在,您的方法将返回double,并将该值赋给o[i]元素

当用作方法的返回类型时,void指定该方法不返回值

很明显,你想在这里返回一个值。因为正如我所想,你想把x调整成非负的。所以我认为将代码更改为返回double是最好的方法。

您不能将void赋值给任何变量,我认为您应该更改方法的签名:

 public static double ApplyRamp(double x)
 {
     if (x < 0) return 0;
     return x;
 }
现在,您的方法将返回double,并将该值赋给o[i]元素

当用作方法的返回类型时,void指定该方法不返回值


很明显,你想在这里返回一个值。因为正如我所想,你想把x调整成非负的。所以我认为将代码更改为返回double是最好的方法。

如果您只是想得到一个具有相同值的列表,但对于小于offset的值,可以使用LINQ Select将其减小到offset或等于0。 它将通过对o数组中的每个项目应用计算函数来创建一个新列表,然后将此列表分配回o:


如果您只是想获得一个具有相同值的列表,但对于小于偏移量的值,该列表的偏移量减少或等于0,则可以使用LINQ Select。 它将通过对o数组中的每个项目应用计算函数来创建一个新列表,然后将此列表分配回o:


完整的编译器错误消息到底是什么?ApplyRamp返回的是void,而您的o[i]是double类型。您将ApplyRamp的返回赋值给一个变量,但ApplyRamp是void!错误是:“MathEq.Functions.ApplyRampref double”的最佳重载方法匹配有一些无效的参数完整的编译器错误消息是什么?ApplyRamp返回void,而您的o[i]是double类型您将ApplyRamp的返回指定给变量,但ApplyRamp是void!错误是:“MathEq.Functions.ApplyRampref double”的最佳重载方法匹配有一些无效参数,这些参数不会修改现有列表,这似乎是OP试图做的事情。@JonSkeet诚实地说,我不明白你的意思:它通过将这些计算应用于每个项目来创建一个新列表,并将其分配回o,但结果是相同的。不,创建一个新列表与修改现有列表不同。在某些情况下,这可能是一个可行的选择,但并不总是如此。我已经更新了我的答案,以避免混淆OP
. 非常感谢。这仍然不能做同样的事情。是的,它修改o以引用新列表,但如果另一个变量也引用了同一个列表呢?这不会修改现有列表,而OP似乎正试图这样做。@JonSkeet诚实地说,我不明白你的意思:它通过将这些计算应用于每个项目来创建一个新列表,并将其分配回o,但结果是相同的。不,创建一个新列表与修改现有列表不同。在某些情况下,这可能是一个可行的选择,但并不总是如此。我已经更新了我的答案,以避免混淆操作。谢谢!这仍然不能做同样的事情。是的,它修改了o以引用新列表,但是如果另一个变量也引用了相同的列表呢?我选择ref而不是返回实际值的原因是代码必须计算数百个,所以我认为使用ref可以节省内存。那么o[i]是否被视为双重类型?@5422时间:是的,o[i]是双重类型。首先,您应该在执行之前关注正确性。其次,您应该只基于度量而不是猜测进行优化。我怀疑您对ref的实际功能有点困惑-我之所以选择ref而不是返回实际值,是因为代码必须计算数百个值,所以我认为使用ref可以节省内存。那么o[i]是否被视为双重类型?@5422时间:是的,o[i]是双重类型。首先,您应该在执行之前关注正确性。其次,您应该只基于度量而不是猜测进行优化。我怀疑你对ref的实际功能有点困惑-看到了吗