盐城网站建设包括哪些,网店代运营哪家好,五华网站建设,行政单位门户网站建设方案说到泛型方法#xff0c;这个是.net 2.0的时候引入的一个重要功能#xff0c;c#2.0也对此作了非常好的支持#xff0c;可以不需要显试的声明泛型类型#xff0c;让编译器自动推断#xff0c;例如#xff1a; 1 void FT(T value){}
2 //...
3 int i 0;
4 F(i); 此… 说到泛型方法这个是.net 2.0的时候引入的一个重要功能c#2.0也对此作了非常好的支持可以不需要显试的声明泛型类型让编译器自动推断例如 1 void FT(T value){}
2 //...
3 int i 0;
4 F(i); 此时编译器可以自动推导出这里的T就是int这极大的方便了我们写代码的效率。 说到扩展方法这个是.net 3.5的时候引入的另一个重要功能c#3.0也在linq中大量的应用这个功能当扩展方法是扩展一个泛型的类型时显然也不需要我们指定具体的泛型类型编译器会为我们自动推断例如 1 static void FT(this ListT list){}
2 //...
3 Listint list new Listint();
4 list.F(); 最后说到协变和逆变也就是c#中的in/out这个是.net 4.0的时候引入的一个重要的功能例如 1 Funcstring foo () Foo;
2 Funcobject bar foo; 然后我们将泛型方法推断和协变和逆变放在一起 1 public static void Foo(this Actionstring action){}
2 //...
3 Actionobject action o {};
4 action.Foo(); 看起来很不错不过要是遇到些复杂点的会怎么样 1 public static void Foo(this IEnumerableIEnumerableobject that) {}
2 //...
3 ListListstring bar new ListListstring();
4 bar.Foo(); 看到这里相信所有都为c#的in/out拍手叫好不过别急除了outout我们还可以玩令人抓狂的inin 1 public static void Foo(this ActionActionobject that) {}
2 //...
3 ActionActionstring action a a(O_O);
4 action.Foo(); 看到这里有没有发现什么问题如果你没觉得有什么不舒服的感觉说明你一定是懂协变和逆变的高手或是完全不懂的初学者。 先想下定义Actionin TT 是in的也就是Actionobject里面的object可以被string这样更具体的类型替代而这里ActionActionstring里面的Actionstring被Actionobject替代了怎么看都感觉有些怪异不过在细细品味一下就可以发现这个结果是完全合理的。string虽然比object更具体不过一个接受string的方法可比一个接受object的方法更抽象所以可以简单的得到一个结论ininout 文章要是到这里结束估计很多人就认为本文是对c#的无比赞美了吧不过重点是这里别忘了多个泛型参数可以玩出很多猥琐的东西例如双/多泛型锁定随便起的名字 1 public static void FooT(this ActionT, T that) {}
2 //...
3 Actionstring, object action (s, o) {};
4 action.Foo(); c#编译器对扩展方法支持的确是有一手这么变态的T也可以被推断出是object不得不佩服一把再来看看out的情况别忘了前面的结论ininout 1 public static void FooT(this ActionActionT, ActionT that) {}
2 //...
3 ActionActionstring, object action (s, o) {};
4 action.Foo(); c#编译器依然表现出专业的结果正确的推断出了T应当是string不过泛型方法的类型推断却完全是另外一番风景 1 public void FooT(ActionT, T that) {}
2 //...
3 Actionstring, object action (s, o) {};
4 Foo(action); // failed.
5 Fooobject(action); // failed.
6 Foo((Actionobject, object)action); // succeeded. 看到这个结果是不是想大骂c#编译器这也太山寨了吧。 别急我们还可以玩得更加浮云 1 public static FooT(this ActionActionT, ActionT that) {}
2 // ...
3 ActionActionListstring, ActionArrayList bar null;
4 bar.Foo(); // failed.
5 bar.FooIEnumerable(); // succeeded. 或者这个 public static FooT(this ActionT, T that) {}
// ...
ActionIEnumerablechar, IComparablestring action null;
action.Foo(); // failed.
action.Foostring(); // succeeded. c#编译器显然不想瞎猜T的类型是什么要求必须编程者明确指出T的具体类型。 转载于:https://www.cnblogs.com/vwxyzh/p/3704220.html