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
}
どうすればこれを簡単に行うことができますか?
できません。ただし、に入れたい値ref int
はとにかく入れることができref long
ます。初期値と、の範囲外の場合に何をしたいのかを気にする必要がありますint
。
refパラメーターに書き込むか、コード内で読み取る必要がある場所はいくつありますか?1か2か所しかない場合は、適切なタイミングで適切にキャストするだけで大丈夫です。それ以外の場合は、新しい方法を導入することをお勧めします。
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/finalで修正できますが、それは少し不格好です。実際、try / finalの動作が必要な場合は、すべてを1つの方法で簡単に実行できます。
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;
null許容型であるかどうかに関係なく、オーバーフローする可能性があるため、intにlongを安全にキャストすることはできません。
これを試して
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;
}