我需要在一个方法中将一个long转发为一个int,其中long作为ref变量传递:
public void Foo(ref long l)
{
// need to consume l as an int
}
我怎样才能轻松做到这一点?
答案 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;
}