//This is an (incomplete) wrapper for int32. It behaves like an int, except that it //implements the IArithmetic<T> interface. As you can see, writing wrappers is //a lot of work and results in a lot of unnessecary method calls. //Since .NET 2.0 does not support an IArithmetic<T> interface, each numeric library will //presumably come with its own wrapper classes. namespace Lambda { public struct ArithmeticInt32 : IFormattable, IConvertible, IComparable, IComparable, IArithmetic { private int value; public ArithmeticInt32(int a) { this.value = a; } public static implicit operator ArithmeticInt32(int a) { return new ArithmeticInt32(a); } public static implicit operator int(ArithmeticInt32 a) { return a.value; } ArithmeticInt32 IAddable.Add(ArithmeticInt32 a) { return value + a; } ArithmeticInt32 ISubtractable.Subtract(ArithmeticInt32 a) { return value - a; } ArithmeticInt32 INegatable.Negate() { return -value; } ArithmeticInt32 IHasZero.Zero { get { return 0; } } ArithmeticInt32 IMultipliable.Multiply(ArithmeticInt32 a) { return value * a; } ArithmeticInt32 IDivisible.Divide(ArithmeticInt32 a) { return value / a; } ArithmeticInt32 IHasOne.One { get { return 1; } } string IFormattable.ToString(string f, System.IFormatProvider fp) { return value.ToString(f, fp); } TypeCode IConvertible.GetTypeCode() { return ((IConvertible)value).GetTypeCode(); } bool IConvertible.ToBoolean(System.IFormatProvider fp) { return ((IConvertible)value).ToBoolean(fp); } char IConvertible.ToChar(System.IFormatProvider fp) { return ((IConvertible)value).ToChar(fp); } sbyte IConvertible.ToSByte(System.IFormatProvider fp) { return ((IConvertible)value).ToSByte(fp); } byte IConvertible.ToByte(System.IFormatProvider fp) { return ((IConvertible)value).ToByte(fp); } short IConvertible.ToInt16(System.IFormatProvider fp) { return ((IConvertible)value).ToInt16(fp); } ushort IConvertible.ToUInt16(System.IFormatProvider fp) { return ((IConvertible)value).ToUInt16(fp); } int IConvertible.ToInt32(System.IFormatProvider fp) { return ((IConvertible)value).ToInt32(fp); } uint IConvertible.ToUInt32(System.IFormatProvider fp) { return ((IConvertible)value).ToUInt32(fp); } long IConvertible.ToInt64(System.IFormatProvider fp) { return ((IConvertible)value).ToInt64(fp); } ulong IConvertible.ToUInt64(System.IFormatProvider fp) { return ((IConvertible)value).ToUInt64(fp); } float IConvertible.ToSingle(System.IFormatProvider fp) { return ((IConvertible)value).ToSingle(fp); } double IConvertible.ToDouble(System.IFormatProvider fp) { return ((IConvertible)value).ToDouble(fp); } decimal IConvertible.ToDecimal(System.IFormatProvider fp) { return ((IConvertible)value).ToDecimal(fp); } DateTime IConvertible.ToDateTime(System.IFormatProvider fp) { return ((IConvertible)value).ToDateTime(fp); } string IConvertible.ToString(System.IFormatProvider fp) { return ((IConvertible)value).ToString(fp); } object IConvertible.ToType(System.Type t, System.IFormatProvider fp) { return ((IConvertible)value).ToType(t, fp); } int IComparable.CompareTo(object o) { return value.CompareTo(o); } int IComparable.CompareTo(ArithmeticInt32 a) { return ((IComparable)value).CompareTo(a); } bool IComparable.Equals(ArithmeticInt32 a) { return ((IComparable)value).Equals(a); } } }