0

I've got a function that's supposed to add up a bunch of generics, if possible. Otherwise, it returns the value of the last generic it saw. I'd like to loop through my list of generics, try adding them, and then catch an exception if/when they can't be added. I understand that you can't try any opperators on a generic, but I can't understand why. Isn't attempting a certain method that may fail exactly why try catch was build for?

I'm pretty sure there isn't an easy way around this, but if there is, let me know.

Also, the offending code:

T getValueAtTime(float time)
{
    T toReturn = officalValue.Value;

    float maxValue;
    velocities.Sort();
    foreach(ValueAtTime<T> toAdd in velocities)
    {
        if(toAdd.AtTime < time)
        {
            try
            {
                toReturn += toAdd.Value;
            }
            catch(OpperatorUnavailableError err)
            {
                toReturn = toReturn + toAdd.Value;  
            }
            catch(Exception ex)
            {
                toReturn = toAdd.Value; 
            }
        }
    }
    return toReturn;
}
4

3 に答える 3

1

ジェネリックでの try-catch に対する c# の特定の禁止事項に関係なく、try catch は標準的な操作方法の一部であってはなりません。あなたのコードは、障害を克服するために try-catch に依存しています。それはまったく間違った使い方です。try-catch は、制御不能な (または少なくとも予測不可能な) 状況で失敗する可能性のある操作をテストし、その操作をシャットダウンまたは再試行することを目的としています。マネージ コードがエラーをキャッチするのは非常にコストがかかります。これは、論理的な制御メカニズムを意図したものではありません。

編集あなたの質問を説明するあなたのコメントに基づいて、私は代替案を思いつきました。さまざまなゲーム オブジェクトを操作しています。これにはジェネリックは必要ありません。インターフェイスが必要です。すべてのオブジェクトIhasValueAtTimeがメソッドfloat getValueAtTime(float time)でインターフェイスを実装している場合、そのような関数を作成できますfloat addTwoGetValueAtTimeObjectsSum(IhasValueAtTime item1, IhasValueAtTime item2)

于 2012-10-27T06:16:36.557 に答える
0

toReturn += toAdd.Value問題は、 と とは異なる動作を期待していることだと 思います toReturn = toReturn + toAdd.Value。それらは(ほぼ)まったく同じです。詳細については、このリンクを参照してください。

したがって、try が例外をスローすると、catch も同じ例外をスローします。みたいなことをしたほうがいいと思います。

 T toReturn = officalValue.Value;

float maxValue;
velocities.Sort();
foreach(ValueAtTime<T> toAdd in velocities)
{
    if(toAdd.AtTime < time)
    {
        try
        {
            toReturn += toAdd.Value;
        }
        catch(OpperatorUnavailableError err)
        {
            toReturn = toAdd.Value;
            break; 
        }
    }
}
return toReturn;
于 2012-10-27T06:13:31.083 に答える
0

Tあなたのメソッドを含むクラス/構造体への汎用パラメーターだと思います。さて、あなたがどの一般的な制約を設定したかはわかりませんが、演算子をオーバーロードする型だけTに制約することはできません。T+

Tしたがって、がジェネリック パラメータの場合、これは実行できません。

どのタイプを使用していTますか? のような単純な型やint、言語で「ネイティブ」にサポートされているもの、または演算子をオーバーロードするユーザー定義型ですか?doubledecimal++

于 2012-10-27T07:46:03.297 に答える