0

我需要在 long 作为 ref 变量传递的方法中将 long 向下转换为 int:

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

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

4

5 回答 5

5

你不能。但是,无论如何,您想放入 a 的任何值ref int都可以放入 a 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;
    }
}
于 2009-06-02T20:02:41.233 回答
3

你没有。你不能把你的参考指向不同的类型。调用您的方法的代码如何知道它已更改?

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

private void Process(ref long l)
{
    int i = (int)l;
    // do whatever
}
于 2009-06-02T19:58:01.163 回答
1

你对细节有点了解,但如果你在谈论这种情况:

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

int foo;
Something(ref foo);

试试这个:

long foo;
Something(ref foo);
int bar = (int) foo;
于 2009-06-02T19:59:21.973 回答
1

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

试试这个

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

        int x = (int)blah.Value;

        Console.WriteLine(x); //Not What you expect
于 2009-06-02T20:01:20.097 回答
0

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

void Method(ref long myValue)
{
   int tempValue = (int)myValue;
   // change tempValue
   myValue = tempValue;
}
于 2009-06-02T19:59:08.433 回答