【问题标题】:Null-coalescing operator with ref keyword带有 ref 关键字的空合并运算符
【发布时间】:2025-12-31 00:50:09
【问题描述】:

编辑

这是对我的问题的更好解释。尤其是回答“我为什么要使用引用,为什么不直接使用double?”的问题。

所以我实际上有以下变量:

double? Left_A, Left_B;
double? Right_A, Right_B;
double? Result_Left, Result_Right;

用户要么设置左侧变量的值,要么设置右侧变量的值。它在我的 ViewModel 中处理。我正在计算结果的值,基于 一些公式,如result = a * b 等。

左右变量的公式相同。

所以我只想创建一个像引用变量'a'和'b'这样的“指针”,其值将是Left_ALeft_B的值,这样我就不必执行以下操作:

if(Left_A != null) {
    Result_Left = Left_A * Left_B;
} else {
    Result_Right = Right_A * Right_B;
}
//There are more such formulas for many use-cases..

我想要这样的东西..

ref double? result, a, b;
a = ref Left_A ?? ref Right_A;  //This gives error.
b = ref (Left_B ?? Right_B);  //This gives error.
result = Result_Left ?? Result_Right;

result = a * b;

我希望我在这件事上没有做错什么..


我正在尝试将Null-coalescing operatorref keyword 一起使用

我的赋值语句如下:

注意:根据我这里省略的业务逻辑,保证 a & b 都不会为空。它们中的任何一个都有一个值。

double? x = a ?? b;   // a and b are also of type "double?".

但是,我希望 x 成为引用类型变量。这可能吗?

我尝试了以下方法,但都给出了编译错误。尤其是最后一个:

  • ref double? x = ref (a ?? b);

  • ref double? x = ref a ?? ref b;

  • ref double? x = (ref a) ?? (ref b);

  • ref double? param1 = ref ( please work!!! -.-' );

有什么想法吗?

【问题讨论】:

  • 仍然不清楚你想要什么。为什么要参考?为什么是两个变量?您希望它们如何同时合二为一?对我来说似乎是一个 XY 问题。
  • 我希望 x 成为引用类型变量 - 你是什么意思?你真正想要达到什么目标?
  • double? x = a ?? b; 有什么问题?
  • 也许你想使用指针,那么?它们几乎是参考。
  • @OfirWinegarten Pl。检查编辑。

标签: c# operators ref null-coalescing-operator


【解决方案1】:

这里不需要使用ref 关键字。 以下将起作用:

double a = (double) (Left_A ?? Right_A);
double b = (double) (Left_B ?? Right_B);
double result = a * b;

或者用一个衬垫:

result = (double) (leftA ?? rightA) * (double) (leftB ?? rightB);

【讨论】:

  • 我实际上希望将更改反映在原始变量(L/R)中......而且我很好奇如何制作?和 ref 一起工作 :) 事实证明,我们不能!
  • 那你为什么不把这些变量和逻辑包装在一个类中,每次都用它来提供你的结果......?
  • 好建议。但是每次检查我是否必须将结果分配给 L/R 的困境仍然存在。
  • 也许我可以在这些方法中使用out 参数,根据你的想法..
【解决方案2】:

可以通过方法来完成:

ref double? GetValue(ref double? a, ref double? b) {
    if (a == null) return ref b; else return ref a;
}

那么,

ref double? x = ref GetValue(ref a, ref b);

我不认为它可以使用 null-coalescing 运算符来完成。

【讨论】:

  • 虽然这是 C#7 中的有效语法,但这里有什么意义呢?为什么不只是double? x = a ?? b;
  • @OfirWinegarten 关键是要更改原始变量,不知道为什么。 VijayChavda,你能告诉我们你真正想要什么吗?
  • OP 没有提到任何关于函数的内容......没有看到重点。
  • @Dennis_E 虽然我没想到我需要一个函数,但无论如何我都会尝试这种方式。如果您需要更好的解释,请检查编辑。
【解决方案3】:

//保证a/b不为空。

无法保证。它只是检查a 是否为空,如果是,则将b 分配给x

如果您的两个变量都是double?,并且您不需要结果可以为空,那么您可以使用.GetValueOrDefault()

double x = (a ?? b).GetValueOrDefault();
double x = (a ?? b).GetValueOrDefault(-0.5); // Or this.

【讨论】:

  • 没有。根据我的业务逻辑,我只是​​说 a 和 b 都不会为空。我并不是说下一个声明将确保..
  • 请检查编辑,我已经说清楚了:)
  • 答案与问题无关。你甚至没有解决ref 问题。
  • @adjan 当然,因为问题不是很清楚。