什么是C#数值types的“基类”?

假设我想要一个可以使用任何数字的方法,是否有一个基类(或其他概念),我可以使用?

据我所知,我必须为所有不同的数字types(Int32,Int16,Byte,UInt32,Double,Float,Decimal等)重载。 这似乎非常乏味。 要么或者使用types“对象”,并抛出exception,如果他们不可转换或分配给双 – 这是非常糟糕的,因为这意味着没有编译时间检查。

更新:好的感谢您的意见,你是正确的稻草人和马克,实际上宣布它为Double实际上适用于所有除了小数。

所以我要找的答案是Double – 它在这里像一个基类,因为大多数的数字types都是可以赋值的。 (我想Decimal不能分配给Double,因为它可能会变得太大。)

public void TestFormatDollars() { int i = 5; string str = FormatDollars(i); // this is OK byte b = 5; str = FormatDollars(b); // this is OK decimal d = 5; str = FormatDollars(d); // this does not compile - decimal is not assignable to double } public static string FormatDollars(double num) { return "$" + num; } 

答案是:您不需要为所有数字types提供重载,只需为DoubleDecimal提供即可 。 所有其他的(除非是非常大的一些)都会被自动转换成这些。

不是基地,但实际上是红鲱鱼。 基类System.ValueType没有什么帮助,因为它包含非数字的types。 我读的语言参考是让我感到困惑的第一个:)

(我只是在寻找谁来归结答案,这是稻草人和马克·格雷韦尔的组合,但由于他们是评论我已经把答案放在这里)

没有一个(或者至less不是一个只是 “数字”)。 你可以使用:

 void Foo<T>(T value) where T : struct {...} 

但是,这允许任何结构 – 不只是数字。 如果你想做算术, 通用的操作符可能是有用的。 除此之外; 超载它是最可行的select。

简短的答案是:数字types是值types,因此它们来自System.ValueType。 完整的答案是:你应该从MSDN阅读这篇文章 。 而且我认为你应该阅读C#语言参考:)。 值types不等于数值types,因为值types还包括结构和枚举。

数字types的基类是ValueType

不幸的是,仍然不会帮助你: DateTimeboolEnum和数百其他types也从ValueType派生。 .NET中没有NumericType基类。

重载的方法签名在这里出了问题吗? 如果你想要一组受限的方法来执行相同的任务,你可以参与公开的方法,并调用一个私有方法,通过将input转换为一个double来获取任意数字。

可悲的是没有任何数字types的基类。 但是你可以用每个数字types和每个数字types的隐式转换创build一个类,如下所示:

 #region Imports using System.Diagnostics; #endregion namespace System { public class Number { #region Variables private decimal number = 0; #endregion #region Override Methods [DebuggerHidden] public override int GetHashCode() { return this.number.GetHashCode(); } [DebuggerHidden] public override bool Equals(object obj) { if (!(obj is Number)) return false; return this.number == ((Number)obj).number; } [DebuggerHidden] public override string ToString() { return this.number.ToString(); } #endregion #region Operators [DebuggerHidden] public static Number operator +(Number a, Number b) { return a.number + b.number; } [DebuggerHidden] public static Number operator -(Number a, Number b) { return a.number - b.number; } [DebuggerHidden] public static Number operator *(Number a, Number b) { return a.number * b.number; } [DebuggerHidden] public static Number operator /(Number a, Number b) { return a.number / b.number; } [DebuggerHidden] public static Number operator %(Number a, Number b) { return a.number % b.number; } [DebuggerHidden] public static Number operator &(Number a, Number b) { return (int)a & (int)b; } [DebuggerHidden] public static Number operator |(Number a, Number b) { return (int)a | (int)b; } [DebuggerHidden] public static Number operator ^(Number a, Number b) { return (int)a ^ (int)b; } [DebuggerHidden] public static Number operator <<(Number a, int b) { return (int)a << b; } [DebuggerHidden] public static Number operator >>(Number a, int b) { return (int)a >> b; } [DebuggerHidden] public static bool operator ==(Number a, Number b) { return a.Equals(b); } [DebuggerHidden] public static bool operator !=(Number a, Number b) { return !a.Equals(b); } [DebuggerHidden] public static bool operator <(Number a, Number b) { return a.number < b.number; } [DebuggerHidden] public static bool operator <=(Number a, Number b) { return a.number <= b.number; } [DebuggerHidden] public static bool operator >(Number a, Number b) { return a.number > b.number; } [DebuggerHidden] public static bool operator >=(Number a, Number b) { return a.number >= b.number; } [DebuggerHidden] public static implicit operator decimal(Number num) { return num.number; } [DebuggerHidden] public static implicit operator double(Number num) { return (double)num.number; } [DebuggerHidden] public static implicit operator float(Number num) { return (float)num.number; } [DebuggerHidden] public static implicit operator int(Number num) { return (int)num.number; } [DebuggerHidden] public static implicit operator short(Number num) { return (short)num.number; } [DebuggerHidden] public static implicit operator byte(Number num) { return (byte)num.number; } [DebuggerHidden] public static implicit operator string(Number num) { return num.number.ToString(); } [DebuggerHidden] public static implicit operator Number(decimal num) { Number i = new Number(); i.number = num; return i; } [DebuggerHidden] public static implicit operator Number(double num) { return (decimal)num; } [DebuggerHidden] public static implicit operator Number(float num) { return (decimal)num; } [DebuggerHidden] public static implicit operator Number(int num) { return (decimal)num; } [DebuggerHidden] public static implicit operator Number(short num) { return (decimal)num; } [DebuggerHidden] public static implicit operator Number(byte num) { return (decimal)num; } #endregion } } 

下面是如何使用这个类:简单地写所有的数字!

 public void TestFormatDollars() { int i = 5; string str = FormatDollars(i); // this is OK byte b = 5; str = FormatDollars(b); // this is OK decimal d = 5; str = FormatDollars(d); // this is OK too!!! } public static string FormatDollars(Number num) { return "$" + num; }