2011-05-24 34 views
2

我有以下方法:C#语法糖超载

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

    } 

我希望能够有这可能需要在任一字节,短裤,或整数于这些值强制一非负数的单一方法。我怎么能做到这一点?

+0

性能是一个问题吗? – Mehrdad 2011-05-24 16:21:00

+2

我对这个问题感到困惑。字节已经是非负面的,为什么你需要对它们做任何事情? – 2011-05-24 16:27:12

回答

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

可能是这样的(测试):

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

'if((numIn <0)...'huh? – Mehrdad 2011-05-24 16:20:24

+0

这里的问题是为了比较而返回一个int值,为了使签名有效,必须添加“where T:struct”不是那么简单的将任何结构转换为整型,最简单的方法是重载,或者像其他人所说的那样使用库函数,或者将调用者转换为int? – captncraig 2011-05-24 16:22:03

+2

这不会起作用,你不能使用'<' – 2011-05-24 16:22:54

1

我认为你可以做到这一点有:

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

结果将是22

OR

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

结果将是22.2

+0

Nope,I不要绝对的价值。 – sammarcow 2011-05-24 16:26:43

5

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

+1

那里可能是一个GetValueOrDefault()? – 2011-05-24 16:26:07