c#句法糖超载

时间:2011-05-24 16:12:38

标签: c# generics operator-overloading

我有以下方法:

virtual public int nonNeg(int? numIn)
    {
        if ((numIn < 0) || (numIn ==null))
        {
            return 0;
        }
        else return (int)numIn;

    }

我希望能够有一个方法可以接受字节,短路或整数来强制这些值为非负数。我怎么能做到这一点?

4 个答案:

答案 0 :(得分:5)

或者只使用Math.Max( 0, numIn)

答案 1 :(得分:5)

我通常不建议这样做,但是在我的脑海中,以下超载应该涵盖大多数情况。它们将涵盖可空类型和非可空类型,编译器将选择适当的重载。

public static T nonNeg<T>(T n) where T : struct, IComparable
{
  if (n.CompareTo(default(T)) <= 0)
  {
    return default(T);
  }
  return n;
}

public static T nonNeg<T>(T? n) where T : struct, IComparable 
{
  if (!n.HasValue || n.Value.CompareTo(default(T)) <= 0)
  {
    return default(T);
  }
  return n.Value;
}

答案 2 :(得分:2)

可能是这样的(测试过的):

virtual public T nonNeg<T>(T numIn) where T : IComparable<T>
        {
            if (numIn==null){
                return default(T);
            }

            if (Comparer<T>.Default.Compare(numIn,default(T))<0)
            {
                return default(T);
            }
            else
                return (T)numIn;
        }

答案 3 :(得分:1)

我认为你可以这样做:

int negativeNumber = -22;
int nonNegativeNumber = Math.Abs(negativeNumber);

结果将是22

OR

decimal negativeNumber = -22.2;
decimal nonNegativeNumber = Math.Abs(negativeNumber);

结果将是22.2