0

如果可能的话,我有一个应该添加一堆泛型的函数。否则,它返回它看到的最后一个泛型的值。我想遍历我的泛型列表,尝试添加它们,然后在无法添加它们时捕获异常。我知道您不能在泛型上尝试任何运算符,但我不明白为什么。是不是在尝试某种可能失败的方法,这正是为什么构建 try catch 的原因?

我很确定没有一个简单的方法可以解决这个问题,但如果有,请告诉我。

另外,有问题的代码:

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

不管 c# 在泛型中对 try-catch 的具体禁止如何,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,double并且在语言decimal中具有“本机”支持+,还是重载运算符的用户定义类型+

于 2012-10-27T07:46:03.297 回答