泛型差别参数范例生成的对象是互相自力的。
//如 Tuple<string> ts; Tuple<object> to; //ts to 是两个范例的对象。
许多时刻,我们愿望完成 to = ts 这类操纵,为何?由于看上去它应当云云。
为了到达这个目的,就要处置惩罚“泛型参数转换的题目”,这个题目的学问点是in out 泛型变体。老实说,这个题目自身不难题,只是异常不直观,很轻易让人遗忘。
起首一点,为了完成to = ts,现实上是有条件的,那就是该参数只能用在“返回范例”上。
//如 delegate object FuncObj(); FuncObj func = ()=>"string";
func之所以胜利,就是由于string 可以转换成 object。当“用户”挪用func,愿望获得的是object对象,而string也是object对象,所以没有任何题目。
这里的关键是学会采纳"用户"的视角剖析题目。
//A delegate void FuncObj2(object obj); FuncObj2 func2 = (string str)=>{}; //B delegate void FuncStr(string str); FuncStr func3 = (object obj)=>{};
剖析这两组代码,哪个越发合理?
在用户角度,它应用的是func2 和 func3
用户应用func2,通报的对象必定是object,但现实处置惩罚的函数是(string)=>{},object是没法转换成string的,所以很不合理。
用户应用func3,通报的对象只能是string,而现实处置惩罚的函数是(object)=>{},string 是可以转换成object的,所以是合理的。
固然这两组代码都是不成立的,由于函数参数范例不婚配。
然则泛型供应了一个要领,让范例不婚配的对象之间可以隐式转换!它完成的逻辑就是上面剖析的。
//out 润饰返回范例 delegate ResultType FuncOut<out ResultType>(); //in 润饰参数范例 delegate void FuncIn<in ParamType>(ParamType param); //这是一最先我们想做到的目的 FuncOut<object> fun4 = () => "string"; //这个结果恰好相反 FuncIn<object> funcobj = (object obj) => { }; FuncIn<string> fun5 = funcobj; //注重,泛型变体平常只能和泛型变体之间隐式转换 //lambda表达式会自动转换成参数雷同的泛型变体,但没法接着做变体之间的隐式转换,所以须要funcobj来过渡
out润饰返回范例,in润饰参数范例,照样挺抽象的,然则要注重泛型in参数,和out参数恰好相反。
最先我们想完成 to = ts,只是看到题目的一半,现实上泛型是存在 ts = to的可能性的,愿望读者能明白这一点。
总结:
out : to = ts; in : ts = to;
没有润饰:to,ts完整自力。
---------------------------(备注)-------------------------------
out 参数:只能用在返回范例。
in 参数:只能用在参数。
没有润饰:恣意位置。
---------------------------(备注2)------------------------------
in、out泛型参数只能用在托付和接口上面。
//综合应用 delegate ResultType FuncInOut<in ParamType, out ResultType>(ParamType param); FuncInOut<object, string> funcobj2 = (object obj) => "string"; FuncInOut<string, object> func6 = funcobj2;
以上就是C# 泛型参数转换的细致引见的内容,更多相干内容请关注ki4网(www.ki4.cn)!