如何在方法中向下转换ref变量

时间:2009-06-02 19:56:26

标签: c# .net casting ref-parameters

我需要在一个方法中将一个long转发为一个int,其中long作为ref变量传递:

public void Foo(ref long l)
{
    // need to consume l as an int
}

我怎样才能轻松做到这一点?

5 个答案:

答案 0 :(得分:5)

你做不到。但是,您想要放入ref int的任何值都可以放入ref long - 您只需担心初始值,以及如果超出范围则要执行的操作int

您需要在ref参数中写入多少个位置或在代码中读取它?如果它只在一两个地方,你应该可以在正确的时间适当地投射。否则,您可能想要引入一种新方法:

public void Foo(ref int x)
{
    // Here's the body I *really* want
}

public void Foo(ref long x)
{
    // But I'm forced to use this signature for whatever
    // reasons. Oh well. This hack isn't an *exact* mimic
    // of ref behaviour, but it's close.

    // TODO: Decide an overflow policy
    int tmp = (int) x;
    Foo(ref tmp);
    x = tmp;
}

我在评论中说这不是对行为的精确模仿的原因是,即使在方法返回之前,通常对原始ref参数的更改也是可见的,但现在它们只会在最后显示。此外,如果方法抛出异常,则不会更改该值。后者可以用try / finally修复,但这有点笨重。事实上,如果你想要try / finally行为,你可以轻松地在一个方法中完成所有这些:

public void Foo(ref long x)
{
    int y = (int) x;
    try
    {
        // Main body of code
    }
    finally
    {
        x = y;
    }
}

答案 1 :(得分:3)

你没有。您无法参考并将其指向其他类型。调用你的方法的代码如何知道它被改变了?

如果您只想将值作为int使用,那么您可以执行以下操作:

private void Process(ref long l)
{
    int i = (int)l;
    // do whatever
}

答案 2 :(得分:1)

你对细节有点了解,但如果你在讨论这个场景:

public void Something(ref long something)
{
    // code
}

int foo;
Something(ref foo);

试试这个:

long foo;
Something(ref foo);
int bar = (int) foo;

答案 3 :(得分:1)

你无法安全地将long转换为int,无论它是否可以为空,因为它有可能溢出。

试试这个

        if (!blah.HasValue)
            blah = long.MaxValue;

        int x = (int)blah.Value;

        Console.WriteLine(x); //Not What you expect

答案 4 :(得分:0)

你不能直接投这个。最好的选择是将它转换为本地,然后在方法结束时分配它。

void Method(ref long myValue)
{
   int tempValue = (int)myValue;
   // change tempValue
   myValue = tempValue;
}