答案 0 :(得分:1)
答案 1 :(得分:1)
如果我是正确的,那么唯一的一个小缺点是,你被迫明确提到你正在分裂的TLoot
。
Arrow arrow1;
/* some code initializing arrow1 */
Arrow arrow2 = arrow1.Split<Arrow>(10);
显然,arrow1
是Arrow
,我们无法写任何其他内容(例如Arrow b = a.Split<Potion>(10);
没有任何意义),但遗憾的是Arrow arrow2 = arrow1.Split(10);
不会编译,因为如果没有相同类型的参数,则不能推测泛型方法的返回类型。
以下是诀窍:在Split
上设置Loot
扩展方法。 : - )
它的原型变为public static TLoot Split<TLoot>(this TLoot item, int quantityToTake) where TLoot : Loot
,TLoot
现在发生在位置1的参数中(即使由特殊关键字this
引入:nevermind!)。调用时,第一个参数会消失,因此所有参数都会发生,就好像我们有返回类型推断一样。
您现在可以写Arrow arrow2 = arrow1.Split(10);
了。它是完全合法的,返回的类型是真正的强类型Arrow
(您甚至可以编写var arrow2 = arrow1.Split(10);
然后检查arrow2
的类型以确定。)
我承认它似乎比在这种情况下真正有用的更酷和优雅。 但我喜欢流畅的界面(方法链接),在那里,它真的成了一个巨大的进步。 比较这两个声明:
/*Given an certain among of arrows found in the treasure chamber,
each player in the team receives a fraction of it according to his age
and experience, but always 10 arrows at least anyway.
Ok, ok ! I had to search before finding such an example vaguely accurate
in the context of arrows and potions ! lol*/
foreach(Player p in Team)
p.Arrows = Treasure.Arrows.Split<Arrow>(10).Split<Arrow>(p.Age).Split<Arrow>(p.Experience*2);
foreach(Player p in Team)
p.Arrows = Treasure.Arrows.Split(10).Split(p.Age).Split(p.Experience*2);
好的,这里的好处仍然很差(Treasure.Arrows.Split<Arrow>(10+p.Age+p.Experience*2)
同样有效并且更短!)但实际上有些情况下隐式返回类型会极大地提高可读性。