이 기사에서는 좋은 참조 값을 갖는 C# 일반 매개변수 변환에 대한 관련 지식을 소개합니다.
제네릭의 다양한 매개변수 유형에 의해 생성된 개체는 독립적입니다. 서로.
//如 Tuple<string> ts; Tuple<object> to; //ts to 是两个类型的对象。
=ts 연산을 구현하고 싶은 경우가 많은데 왜일까요? 그래야 할 것 같으니까요.
이 목표를 달성하려면 "일반 매개변수 변환 문제"를 해결해야 합니다. 이 문제의 지식 포인트는 in out generic 변형입니다. 솔직히 말해서 문제 자체는 어렵지 않고 단지 매우 직관적이지 않고 잊어버리기 쉽습니다.
우선 = ts를 실현하기 위해서는 실제로 전제 조건이 있습니다. 즉, 이 매개변수는 "반환 유형"에서만 사용할 수 있습니다.
//如 delegate object FuncObj(); FuncObj func = ()=>"string";
문자열을 객체로 변환할 수 있으므로 func는 성공합니다. "사용자"가 func를 호출할 때, 그가 얻고자 하는 것은 객체 객체이고, string도 객체 객체이므로 문제가 없습니다.
여기서 핵심은 '사용자' 관점에서 문제를 분석하는 방법을 배우는 것입니다.
//A delegate void FuncObj2(object obj); FuncObj2 func2 = (string str)=>{}; //B delegate void FuncStr(string str); FuncStr func3 = (object obj)=>{};
이 두 코드 세트를 분석해 보세요. 어느 것이 더 합리적인가요?
사용자 입장에서는 func2와 func3을 사용합니다
사용자가 func2를 사용할 때 전달되는 객체는 객체여야 하지만 실제 처리되는 함수는 (string)=> { }, 객체를 문자열로 변환할 수 없으므로 매우 무리합니다.
사용자가 func3을 사용할 때 전달되는 객체는 문자열만 가능하지만 실제 처리되는 함수는 (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# 일반 매개변수 변환에 대한 자세한 소개입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!