ToString() 是 IFormattable 的

解决方案 »

  1.   

    System.Int32.ToString()就是从IFormattable接口实现的
      

  2.   

    当你运行10.ToString();的时候
    实际上 10 已经不是 value type 了,已经被boxing 成了reference type 也就是普通常见的object 了
    而做boxing 的wrapper class 是从Object 继承下来的(就跟普通.net object 一样)
      

  3.   

    Int32的ToString有多种重载方式:public override string ToString();//Object
    public string ToString(string format);//IConvertible
    public string ToString(string format, IFormatProvider provider);//IFormattable值类型.ToString()就会有隐式装箱(boxing)的,先转成object类型,在ToString()。
      

  4.   

    agree all
    System.Int32.ToString()類實現的是IFormattable接口
      

  5.   

    GetType
    Finalize
    MemberwiseClone
    那这三个方法呢?帮助上明确的写着(从 Object 继承)
      

  6.   

    最新发现:下面是我写的源代码
    using System;
    class Demo
    {
    public static void Main()
    {}
    }
    struct str:object
    {}编译之后的结构体部份的msil为:
    .class private sequential ansi sealed beforefieldinit str
           extends [mscorlib]System.ValueType
    {
      .pack 0
      .size 1
    } // end of class str也就是说其实上本身就没有结构体这个东西,内部其实上就是一个sealed class
    但是问题是我在定义结构体时前面加上sealed是不允许的
    所以我觉得这个问题可能是microsoft只许州官放火,不许百姓点灯,他本身的类库
    自已在写的时候都可以允许结构继承,但给我们开发人员就不行了。
      

  7.   

    TO: kehuan(小学生) 
    新鲜
      

  8.   

    补充:我测试了一下,其实所有的struct都是默认由System.ValueType继承
       而来的。
      

  9.   

    小学生朋友,你看看看,没GetType,Finalize,MemberwiseClone[Serializable, StructLayout(LayoutKind.Sequential)]
    public struct Int32 : IComparable, IFormattable, IConvertible
    {
          public const int MaxValue = 0x7fffffff;
          public const int MinValue = -2147483648;
          internal int m_value;
          public int CompareTo(object value);
          public override bool Equals(object obj);
          public override int GetHashCode();
          public override string ToString();
          public string ToString(string format);
          public string ToString(string format, IFormatProvider provider);
          public static int Parse(string s);
          public static int Parse(string s, NumberStyles style);
          public static int Parse(string s, IFormatProvider provider);
          public static int Parse(string s, NumberStyles style, IFormatProvider provider);
          public string ToString(IFormatProvider provider);
          public TypeCode GetTypeCode();
          bool IConvertible.ToBoolean(IFormatProvider provider);
          char IConvertible.ToChar(IFormatProvider provider);
          [CLSCompliant(false)]
          sbyte IConvertible.ToSByte(IFormatProvider provider);
          byte IConvertible.ToByte(IFormatProvider provider);
          short IConvertible.ToInt16(IFormatProvider provider);
          [CLSCompliant(false)]
          ushort IConvertible.ToUInt16(IFormatProvider provider);
          int IConvertible.ToInt32(IFormatProvider provider);
          [CLSCompliant(false)]
          uint IConvertible.ToUInt32(IFormatProvider provider);
          long IConvertible.ToInt64(IFormatProvider provider);
          [CLSCompliant(false)]
          ulong IConvertible.ToUInt64(IFormatProvider provider);
          float IConvertible.ToSingle(IFormatProvider provider);
          double IConvertible.ToDouble(IFormatProvider provider);
          decimal IConvertible.ToDecimal(IFormatProvider provider);
          DateTime IConvertible.ToDateTime(IFormatProvider provider);
          object IConvertible.ToType(Type type, IFormatProvider provider);
    }
      

  10.   

    //下面是反编译出来的GetTypeCode,其实就是返回一个枚举
    public TypeCode GetTypeCode()
    {
          return TypeCode.Int32;
    }
     
    [Serializable]
    public enum TypeCode
    {
          // Fields
          Boolean = 3,
          Byte = 6,
          Char = 4,
          DateTime = 0x10,
          DBNull = 2,
          Decimal = 15,
          Double = 14,
          Empty = 0,
          Int16 = 7,
          Int32 = 9,
          Int64 = 11,
          Object = 1,
          SByte = 5,
          Single = 13,
          String = 0x12,
          UInt16 = 8,
          UInt32 = 10,
          UInt64 = 12
    }
      

  11.   

    我总结一下:
    根据这个问题我发现,其实上.net中只有class ,本身是并不存在struct
    详细来说只存在两种类,一种是引用类型的类,他默认是由object继承而来,
    另一种就是值类型的类,它是sealed类型的,并且默认是由System.ValueType
    继承而来,当然System.ValueType是由System.Object继承而来。
    所以我认为在装箱和取消装箱过程当中System.Value.Type起到了最重要的作用.
      

  12.   

    to: tonybaobao(Tony宝宝)
        你可以去帮助里查一查看有没有GetType
    Finalize
    MemberwiseClone
      

  13.   

    结构体不支持继承,隐式地从object 派生而来,它是隐式密封的。你的结果是对的。
      

  14.   

    简单类型会被boxing的。而类这样的复杂类型直接从Object继承而来。