我可以通过C#中的引用传递原始类型吗?

Aca*_*uza 14 .net c#

我知道C#中的Reference传递复杂类型,而Value传递基本类型.我可以通过C#中的引用传递原始类型吗?

更新:

谢谢你的回答,但我的例子是?

void test(object x) {

}

long y = 1;

test(ref y);
Run Code Online (Sandbox Code Playgroud)

抛出此异常:'ref'参数类型与参数类型不匹配

Eri*_*ert 20

这里有几个不同的问题.

我可以通过C#中的引用传递原始类型吗?

首先,让我们确保这里的行话是正确的.目前还不清楚你的"原始类型"是什么意思.你的意思是"内置到运行时"类型如int还是long?您是指任何值类型,无论是内置还是用户定义?

我会假设你的问题实际上是

我可以通过引用在C#中传递值类型吗?

值类型称为值类型,因为它们是按值传递的.引用类型称为引用类型,因为它们通过引用传递.所以似乎答案是定义,不是.

但是,它并不那么直截了当.

首先,您可以通过装箱将值类型的实例转换为引用类型的实例:

decimal d = 123.4m; // 128 bit immutable decimal structure
object o1 = d; // 32/64 bit reference to 128 bit decimal
object o2 = o1; // refers to the same decimal
M(o2); // passes a reference to the decimal.
o2 = 456.78m; // does NOT change d or o1
Run Code Online (Sandbox Code Playgroud)

其次,您可以通过创建数组将值类型的实例转换为引用:

decimal[] ds1 = new decimal[1] { 123.4m }; 
decimal[] ds2 = ds1;
ds2[0] = 456.7m; // does change ds1[0]; ds1 and ds2 refer to the same array
Run Code Online (Sandbox Code Playgroud)

第三,您可以使用"ref"关键字传递对变量(不是值 - 变量)的引用:

decimal d = 123.4m;
M(ref d);
...
void M(ref decimal x)
{ // x and d refer to the same variable now; a change to one changes the other
Run Code Online (Sandbox Code Playgroud)

尝试将ref long传递给接受ref对象的方法会导致编译错误:'ref'参数类型与参数类型不匹配

正确.两侧变量的类型必须完全匹配.有关详细信息,请参阅此问

为什么'ref'和'out'不支持多态?


Sev*_*yev 15

你当然可以:

public void MyFunction(ref int a)
{
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ite 8

只需使用refout参数修饰符.

void myMethod(ref int myValue) ...
Run Code Online (Sandbox Code Playgroud)

ref是2路. out是1路.


Dan*_*iel 7

您可以使用ref函数定义中参数旁边的单词.

public void func(ref int a)
{
    //do stuff
}

public void doStuf()
{
    int a = 5;
    func(ref a);
}
Run Code Online (Sandbox Code Playgroud)

  • 要记住的一个重要规则是变量必须作为`ref`传递 (2认同)

Jon*_*son 1

更新后,您可以通过引用传递盒装值。

static void Main(string[] args)
{
    var value = 10;
    var boxed = (object)value;
    TakesValueByRef(ref boxed);
    value = (int)boxed;
    // value now contains 5.
}

static void TakesValueByRef(ref object value)
{
    value = 5;
}
Run Code Online (Sandbox Code Playgroud)

请记住,这样做是糟糕的做法,并且有风险(由于强制转换异常)。