c#?:带ref参数的运算符

c#?:带ref参数的运算符,c#,logical-operators,C#,Logical Operators,我有以下课程: public class SubStredisko { public string Name { get; set; } public string Code { get; set; } public VyplatnePasky VyplatnaPaska { get; set; } public MzdoveNaklady MzdoveNaklady { get; set; } public Poistne Poistne { get;

我有以下课程:

public class SubStredisko
{
    public string Name { get; set; }
    public string Code { get; set; }

    public VyplatnePasky VyplatnaPaska { get; set; }
    public MzdoveNaklady MzdoveNaklady { get; set; }
    public Poistne Poistne { get; set; }
}
然后我有两个
SubStredisko
项,其中一个肯定是
null
。我想做的是,我有一个单独的方法,它使用
SubStredisko
进行一些处理,例如更改
VyplatnaPaska
的值等。下面是它的样子:

    private static void VyplatnePasky_Items(ref Stredisko stredisko, XElement myElement)
    {
        //some logic here
    }
我现在尝试做的(我遇到的问题)是使用
?:
运算符按以下方式调用此方法:

VyplatnePasky_Items((sPracovisko == null) ? ref sPracovisko_Dohodari : ref sPracovisko,xElement);
但是,它突出显示了
sPracovisko_Dohodari
sPracovisko
,并出现以下错误:
语法错误,':'预期的

我试着把它们分别放在括号里,但是运气不好。 我做错了什么

p.S.
sPracovisko
sPracovisko_Dohodari
属于
SubStredisko
类型


p.S.2:快速思考一下-也许我甚至不需要这里的
ref
参数?我不确定在这种情况下是否会创建一个新对象,或者我将(在我的空白中)直接更改该特定对象的值。

您不能对
ref
参数使用表达式。您需要两个电话:

if (sPracovisko == null) {
  VyplatnePasky_Items(ref sPracovisko_Dohodari, xElement);
} else {
  VyplatnePasky_Items(ref sPracovisko, xElement);
}

ref
参数必须是变量。它不可能像您尝试的那样是三元表达式。您可以这样做:

var inputParameter = sPracovisko == null ? sPracovisko_Dohodari : sPracovisko;
VyplatnePasky_Items(ref inputParameter, xElement);
注意,使用上面的代码,更改将反映在
inputparameter
上,并且不会影响其他两个变量。如果你想改变变量本身,那么就用@Guffa的答案。

试试这个

VyplatnePasky_Items(((sPracovisko == null) ? ref sPracovisko_Dohodari :   sPracovisko),xElement);


在该
VyplatnePasky_Items
方法中,是否为
stredisko
指定了一个新值?如果不是,则不需要thar ref,即使您正在为该stredisko的属性分配新值。
SubStredisko
是一个
类(而不是
结构),因此它是一个引用类型。那么,如果您只是像
(sPracovisko==null)那样传递它?sPracovisko_Dohodari:sPracovisko
(没有
ref
),您将能够直接操作引用对象的内容。因此不会创建“新对象”。唯一需要使用
ref
关键字的是,如果您希望能够更改变量(
sPracovisko
sPracovisko\u Dohodari
)引用的对象。首先,如果
sPracovisko
sPracovisko_Dohodari
都属于
Stredisko
类型,那么现在可以使用C#7使用三元运算符:
VyplatnePasky_项(ref(sPracovisko==null?ref sPracovisko_Dohodari:ref sPracovisko),xElement)
。但是,更普遍的问题是,您说这些类型是
SubStredisko
而不是
Stredisko
,并且您不能通过引用传递类型,除非它们与确切的类型匹配。请参阅以获取解释。感谢您的回答。还有一个问题(如第2页)-我真的需要一个ref参数吗?是否会创建一个没有ref的新对象?@RobertJ:如果要将某个内容分配给方法中的
sPracovisko\u Dohodari
/
sPracovisko
变量,则只需要
ref
参数。如果没有
ref
关键字,参数将按值发送,这意味着引用类型将作为引用的副本发送到对象。您仍然可以更改对象中的内容。请参阅我上面的评论。使用C#7,现在可以在三元运算符中使用ref:
ref T a=ref(i==0?ref b:ref C)。(本例中的r值也可以传递到
ref
-使用函数而无需分配给ref local)…顺便说一句,可以,即分配的左侧。我想到了这种方法,但是在这种情况下,我们在内存中创建了一个额外的对象,不是吗?这将在一个循环中完成,因此我希望最小化内存消耗。@RobertJ。不,您没有创建其他对象
SubStredisko
是一个类;因此,它是引用类型,这意味着它只是引用同一个对象。
VyplatnePasky_Items(((sPracovisko == null) ? ref sPracovisko_Dohodari :   sPracovisko) out,xElement);