Posted on 2015-07-29 20:23
Onway 閱讀(374)
評論(0) 編輯 收藏 引用 所屬分類:
使用說明
因為某些原因,一直用的都是.NET2,但渣也總得有些追求是不,說不定哪天就用上了呢?
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplicationTest
{
/*
* 變體泛型
*
* .NET4,在泛型接口類型或者泛型委托類型里面,
* 被關鍵字in聲明的泛型參數,其類型可以從父類向子類逆變,只能用作輸入參數
* 被關鍵字out聲明的泛型參數,其類型可以從子類向父類協變,只能用于返回值
* 整個泛型類型是不限于用作輸入參數還是作為返回值
*
* interface IType_IN_OUT<in T1, out T2>
* IType_IN_OUT<Farmer, Person> farmerPersonType = null;
* IType_IN_OUT<Person, Farmer> personfarmerType = null;
* farmerPersonFinder = personFarmerFinder;
*
* 為什么不支持“變體”class呢?跟字段有關系么?
*/
class Program
{
static void Main(string[] args)
{
IType_IN<Person> person_in = null;
IType_IN<Farmer> farmer_in = null;
farmer_in = person_in;
Greeting(person_in);
Console.WriteLine(GetTypeIn() == null);
IType_OUT<Person> person_out = null;
IType_OUT<Farmer> farmer_out = null;
person_out = farmer_out;
Greeting(farmer_out);
Console.WriteLine(GetTypeOut() == null);
Finder_IN<Person> personFinderIn = p => Console.WriteLine(p.GetType());
Finder_IN<Farmer> farmerFinderIn = f => Console.WriteLine(f.GetType());
farmerFinderIn = personFinderIn;
Greeting(personFinderIn);
Console.WriteLine(GetFarmerFinder().GetType());
Finder_OUT<Person> personFinderOut = () => new Person();
Finder_OUT<Farmer> farmerFinderOut = () => new Farmer();
personFinderOut = farmerFinderOut;
Greeting(personFinderOut);
Console.WriteLine(GetPersonFinder().GetType());
Finder_IN_OUT<Farmer, Person> farmerPersonFinder = f => new Person();
Finder_IN_OUT<Person, Farmer> personFarmerFinder = p => new Farmer();
farmerPersonFinder = personFarmerFinder;
// interface IType_IN_OUT<in T1, out T2>
IType_IN_OUT<Farmer, Person> farmerPersonType = null;
IType_IN_OUT<Person, Farmer> personfarmerType = null;
farmerPersonType = personfarmerType;
Console.ReadKey();
}
static void Greeting(IType_OUT<Person> person)
{
Console.WriteLine(person == null);
}
static void Greeting(IType_IN<Farmer> farmer)
{
Console.WriteLine(farmer == null);
}
static IType_OUT<Person> GetTypeOut()
{
IType_OUT<Farmer> farmer = null;
return farmer;
}
static IType_IN<Farmer> GetTypeIn()
{
IType_IN<Person> person_IN = null;
return person_IN;
}
static void Greeting(Finder_OUT<Person> personFinder)
{
Console.WriteLine(personFinder().GetType());
}
static void Greeting(Finder_IN<Farmer> farmerFinder)
{
Console.WriteLine(farmerFinder.GetType());
}
static Finder_OUT<Person> GetPersonFinder()
{
Finder_OUT<Farmer> farmerFinder = () => new Farmer();
return farmerFinder;
}
static Finder_IN<Farmer> GetFarmerFinder()
{
Finder_IN<Person> person = p => Console.WriteLine(p.GetType());
return person;
}
}
interface IType_OUT<out T>
{
}
interface IType_IN<in T>
{
}
interface IType_IN_OUT<in T1, out T2>
{
}
delegate T Finder_OUT<out T>();
delegate void Finder_IN<in T>(T t);
delegate T2 Finder_IN_OUT<in T1, out T2>(T1 t1);
class Person
{
}
class Farmer : Person
{
}
}