c # синтаксическая перегрузка сахара - PullRequest
2 голосов
/ 24 мая 2011

У меня есть следующий метод:

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

    }

Я хочу иметь возможность использовать один метод, который может принимать байты, шорты или целые числа, чтобы эти значения были неотрицательными Как я мог сделать это?

Ответы [ 4 ]

5 голосов
/ 24 мая 2011

Обычно я бы не советовал этого, но из-за пределов моей головы следующие перегрузки должны охватывать большинство ваших случаев. Они будут охватывать обнуляемые типы и не обнуляемые типы, компилятор выберет соответствующую перегрузку.

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;
}
5 голосов
/ 24 мая 2011

Или просто используйте Math.Max( 0, numIn)

2 голосов
/ 24 мая 2011

Возможно что-то вроде этого (проверено):

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;
        }
1 голос
/ 24 мая 2011

Я думаю, что вы можете сделать это с:

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

результат будет 22 * ​​1004 *

ИЛИ

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

результат будет 22,2

...