使用ref关键字的Null-coalescing运算符

时间:2017-06-18 08:04:46

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

修改

这是对我的问题的更好的解释。特别回答问题"为什么我要使用引用,为什么不使用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!!! -.-' );

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

可以通过以下方法完成:

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运算符来完成。

答案 1 :(得分:2)

此处无需使用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);

答案 2 :(得分:0)

  

//保证a / b不为空。

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

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

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