我需要在 long 作为 ref 变量传递的方法中将 long 向下转换为 int:
public void Foo(ref long l)
{
// need to consume l as an int
}
我怎样才能轻松做到这一点?
我需要在 long 作为 ref 变量传递的方法中将 long 向下转换为 int:
public void Foo(ref long l)
{
// need to consume l as an int
}
我怎样才能轻松做到这一点?
你不能。但是,无论如何,您想放入 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;
}
}
你没有。你不能把你的参考指向不同的类型。调用您的方法的代码如何知道它已更改?
如果您只想将值用作int
,那么您可以执行以下操作:
private void Process(ref long l)
{
int i = (int)l;
// do whatever
}
你对细节有点了解,但如果你在谈论这种情况:
public void Something(ref long something)
{
// code
}
int foo;
Something(ref foo);
试试这个:
long foo;
Something(ref foo);
int bar = (int) foo;
无论它是否可以为空,您都不能安全地将 long 转换为 int,因为它有可能溢出。
试试这个
if (!blah.HasValue)
blah = long.MaxValue;
int x = (int)blah.Value;
Console.WriteLine(x); //Not What you expect
你不能直接施放这个。最好的选择是将其转换为本地,然后在方法结束时分配它。
void Method(ref long myValue)
{
int tempValue = (int)myValue;
// change tempValue
myValue = tempValue;
}