>  기사  >  백엔드 개발  >  C# 일반 매개변수 변환에 대한 자세한 소개

C# 일반 매개변수 변환에 대한 자세한 소개

黄舟
黄舟원래의
2017-03-07 11:03:061426검색

이 기사에서는 좋은 참조 값을 갖는 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)를 참고해주세요!



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.