C#数组和泛型的疑问,大牛进
请教一个问题:
   public struct Symbol
     {
         public int Color;
         public Symbol( int color  )
         {
             Color = color;
         }
     }
static void Main( string[] args )
  {
         List<Symbol> s1 = new List<Symbol>();
         Symbol[] s2 = new Symbol[1];
         s1.Add(new Symbol(1,1));
         s2[0] = new Symbol(2,2);
         s1[0].Color = 10;   ------报错
         s2[0].Color = 20;   ------不报错
  }
我想知道,数组和List的索引器有什么区别,为什么数组中的结构体可以直接修改,而List就不行呢?
------解决方案--------------------
http://hi.baidu.com/daijun2007/blog/item/7881ec0f644498e7ab645793.html
------解决方案--------------------
public class Test
   {
       public Symbol MySymbol { get; set; }
		 public Symbol GetSymbol()
		 {
			return new Symbol(10);
		 }
       Test()
       {
          this.symbol.Code = 10; //这也是会报错的。
          GetSymbol().Code = 10;//这还是会报错。
       }
   }
这是因为C#的return处理,如果传的是引用类型,传递的是一个引用,如果是值类型,则传递的是拷贝。所以对return回来的值类型做修改只是修改的一个副本,这很容易引起歧义,使你的代码达不到想要的效果。C#为了避免这个问题和C#的严谨,所以在编译时作为错误处理。
“属性”的get访问器也是要调用return的,所以属性也有这个限制。
索引和数组不同的地方在于,索引器并没有直接对应引用数据存储的地方,而数组则有。
索引器有get访问器与set访问器,用来指明要读取或写入索引器元素时,需要执行的代码。
list的[]操作实际上是索引器,所以s1[0]是执行return的,所以也有这个问题。
数组是直接取数据,跟return没关系,所以没有这个问题。