首页 新闻 会员 周边 捐助

请问一个关于泛型的问题

0
悬赏园豆:30 [已解决问题] 解决于 2008-07-25 13:53
&nbsp;&nbsp;&nbsp; interface ICounter<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void Increment();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int Val<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; struct Counter : ICounter<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void Increment()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("改变前I:" + i.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("改变后I:" + i.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int Val<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("取得I:" + i.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; class C&lt;T&gt; where T : ICounter, new()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void Fct()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T t = new T();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.Increment();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Console.WriteLine(t.Val.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.Increment();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Console.WriteLine(t.Val.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (t as ICounter).Increment();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Console.WriteLine(t.Val.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br><br>&nbsp;&nbsp;&nbsp; class Program<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C&lt;Counter&gt; c = new C&lt;Counter&gt;();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.Fct();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.ReadLine();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>这是一段关于泛型的问题,打印结果是<br>1<br>2<br>2<br><br>可我打了CONSOLE查看得出,值已经改变为3,可为什么取到的值还是2<br><br>还有<br>以下是上面代码的IL一段<br>&nbsp;IL_0067:&nbsp; ldloca.s&nbsp;&nbsp; CS$0$0001<br>&nbsp; IL_0069:&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; instance string [mscorlib]System.Int32::ToString()<br>&nbsp; IL_006e:&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void [mscorlib]System.Console::WriteLine(string)<br>&nbsp; IL_0073:&nbsp; nop<br>&nbsp; IL_0074:&nbsp; ldloc.0<br>&nbsp; IL_0075:&nbsp; box&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; !T<br>&nbsp; IL_007a:&nbsp; callvirt&nbsp;&nbsp; instance void ConsoleApplication5.ICounter::Increment()<br>&nbsp; IL_007f:&nbsp; nop<br>&nbsp; IL_0080:&nbsp; ldloca.s&nbsp;&nbsp; t<br>&nbsp; IL_0082:&nbsp; constrained. !T<br>&nbsp; IL_0088:&nbsp; callvirt&nbsp;&nbsp; instance int32 ConsoleApplication5.ICounter::get_Val()<br>&nbsp; IL_008d:&nbsp; stloc.2<br>&nbsp; IL_008e:&nbsp; ldloca.s&nbsp;&nbsp; CS$0$0001<br>&nbsp; IL_0090:&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; instance string [mscorlib]System.Int32::ToString()<br>&nbsp; IL_0095:&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void [mscorlib]System.Console::WriteLine(string)<br><br><br>不明白为什么T约束某接口而且是T是值类型时,在T的实例上调用接口成员会引发一次装箱操作<br><br>此参考c#与NET实战 ---346页的一个DEMO<br>
yellowyu的主页 yellowyu | 初学一级 | 园豆:120
提问于:2008-07-25 12:27
< >
分享
最佳答案
0
因为接口实例(和类实例即对象一样)是引用类型,你把一个值类型的东西赋值给它,当然需要装箱了.就像object o = 15;一样.
deerchao | 大侠五级 |园豆:8367 | 2008-07-25 13:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册