0

longがref変数として渡されるメソッドでlongをintにダウンキャストする必要があります。

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

どうすればこれを簡単に行うことができますか?

4

5 に答える 5

5

できません。ただし、に入れたい値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;
    }
}
于 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

null許容型であるかどうかに関係なく、オーバーフローする可能性があるため、intにlongを安全にキャストすることはできません。

これを試して

        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 に答える