Shenghe's Blog

我的照片
姓名:

I worked in Aspen Iechnology Inc. My work focus on InfoPlus.21

2009年4月21日星期二

Generics in CLR


昨天看了一篇文章,关于.NET范型的
终于明白了为什么以下代码不能编译:

T  Max<T>( T a, T b )
{
          if( a<b )
                  return b;
          else
                  return a;
}

void main()
{
           int m = Max<int>( 3, 5 );
}

范型的实例化居然是在运行时JIT编译的时候,而不是编译器编译的时候,但是编译是会进行类型安全检查
范型函数中Object中的ToString, GetHashCode等方法是可以调用的,例如上述中你可以调用a.ToString()没问题
说白了:除非你对类似于a这种参数调用的方法是所有.NET类型都支持的,否则无法通过编译,所以Object中的方法可以调用
但是可以可以添加约束来搞定需要调用什么方法的问题
T  Max<T>  where T: IComparable ( T a, T b )
{
          if( a.CompareTo(b) < 0 )
                  return b;
          else
                  return a;
}

看了文章相信你会明白怎么回事
http://msdn.microsoft.com/en-us/magazine/cc163683.aspx

对 .NET感兴趣的同学,可以好好看看





2009年4月20日星期一

as 操作符和强行转换

as 操作符和强行转换

System.Object  o  = new ….;

Student  s  = (Student) o; //转换失败会抛出InvalidCastException

Student  s =  o as Student();// 转换失败,snull

2009年4月19日星期日

boxing 问题

    boxing 问题
当你创建一个值类型对象并获得它实现的接口的时候会有boxing
interface IPerson
{
        string Name{get;set;}
}

public struct Person: IPerson
{....}

 void testBoxing()
{
      IPerson p = new Person(); //boxing
}