如何编写将“+”运算符应用于通用值集合的函数?

时间:2012-10-27 06:01:10

标签: c# generics

如果可能的话,我有一个应该添加一堆泛型的函数。 否则,它返回它看到的最后一个通用的值。 我想循环遍历我的泛型列表,尝试添加它们,然后在无法添加它们时捕获异常。 我知道你不能尝试任何泛型的opperator,但我不明白为什么。 是不是尝试某种方法可能会失败,为什么尝试捕获是为了构建?

我很确定没有一个简单的方法,但如果有,请告诉我。

此外,有问题的代码:

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;
}

3 个答案:

答案 0 :(得分:1)

无论c#在通用中对try-catch的具体禁止,try catch都不应该是您标准操作方法的一部分。您的代码依赖于try-catch来克服障碍。这完全是对它的错误使用。 Try-catch用于测试可能因无法控制(或至少不可预测)的情况而失败的操作,并关闭或重试该操作。托管代码捕获错误是非常昂贵的,并不意味着它是一种逻辑控制机制。

修改我根据您的评论解释了您的问题,确实提出了另一种选择。您正在操作各种游戏对象。这不需要通用;它需要一个界面。如果您的所有对象都使用方法IhasValueAtTime实现了接口float getValueAtTime(float time),那么您可以创建一个类似于float addTwoGetValueAtTimeObjectsSum(IhasValueAtTime item1, IhasValueAtTime item2)的函数

答案 1 :(得分:0)

我认为问题是你期待不同的行为 toReturn += toAdd.ValuetoReturn = toReturn + toAdd.Value。它们(几乎)完全相同。有关详细信息,请参阅此link

因此,当您尝试抛出异常时,您的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;

答案 2 :(得分:0)

我认为你的T是包含你的方法的类/结构的泛型参数。现在,我不知道您对T采用了哪些通用限制,但无法将T限制为仅使+运算符超载的类型。

因此,如果T是通用参数,则无法执行此操作。

您使用T的哪些类型?简单类型,如intdoubledecimal,对语言中的+具有“本机”支持,或者用户定义的类型会使+运算符超载?