부모글 보이기/감추기 AD BLOCK 해제 요청 이 글에는 광고가 많이 들어가 있지 않습니다. adblock을 해제하셔도 글을 읽는데 그다지 부담이 없으니 해제를 부탁드립니다. (연관된 글이 15개 있습니다.) C# 9.0 - (11) 공변 반환 형식(Covariant return types) C# 9.0 - (1) 대상으로 형식화된 new 식(Target-typed new expressions) ; https://www.sysnet.pe.kr/2/0/12363 C# 9.0 - (2) localsinit 플래그 내보내기 무시(Suppress emitting localsinit flag) ; https://www.sysnet.pe.kr/2/0/12364 C# 9.0 - (3) 람다 메서드의 매개 변수 무시(Lambda discard parameters) ; https://www.sysnet.pe.kr/2/0/12365 C# 9.0 - (4) 원시 크기 정수(Native ints) ; https://www.sysnet.pe.kr/2/0/12366 C# 9.0 - (5) 로컬 함수에 특성 지정 가능(Attributes on local functions) ; https://www.sysnet.pe.kr/2/0/12372 C# 9.0 - (6) 함수 포인터(Function pointers) ; https://www.sysnet.pe.kr/2/0/12374 C# 9.0 - (7) 패턴 일치 개선 사항(Pattern matching enhancements) ; https://www.sysnet.pe.kr/2/0/12383 C# 9.0 - (8) 정적 익명 함수 (static anonymous functions) ; https://www.sysnet.pe.kr/2/0/12389 C# 9.0 - (9) 레코드 (Records) ; https://www.sysnet.pe.kr/2/0/12392 C# 9.0 - (10) 대상으로 형식화된 조건식(Target-typed conditional expressions) ; https://www.sysnet.pe.kr/2/0/12399 C# 9.0 - (11) 공변 반환 형식(Covariant return types) ; https://www.sysnet.pe.kr/2/0/12402 C# 9.0 - (12) foreach 루프에 대한 GetEnumerator 확장 메서드 지원(Extension GetEnumerator) ; https://www.sysnet.pe.kr/2/0/12403 C# 9.0 - (13) 모듈 이니셜라이저(Module initializers) ; https://www.sysnet.pe.kr/2/0/12404 C# 9.0 - (14) 부분 메서드에 대한 새로운 기능(New features for partial methods) ; https://www.sysnet.pe.kr/2/0/12405 C# 9.0 - (15) 최상위 문(Top-level statements) ; https://www.sysnet.pe.kr/2/0/12406 C# 9.0 - (16) 제약 조건이 없는 형식 매개변수 주석(Unconstrained type parameter annotations) ; https://www.sysnet.pe.kr/2/0/12423 (이번 실습은 - 오늘 기준 16.7.7의 Visual Studio 2019에서 지원하지 않으므로 Visual Studio Preview 버전으로 실습해야 합니다. 또한 .NET Framework 및 .NET Core 3.1 이하의 런타임에서도 동작하지 않으므로 반드시 .NET 5 환경에서 테스트해야 합니다.) C# 언어는, 메서드의 구분을 이름과 인자의 타입으로 결정합니다. 달리 말하면, 반환 타입을 포함하지 않기 때문에 다음과 같은 식으로 메서드를 정의하면, public class TestClass { public short MyMethod(int count) { return 0; } public int MyMethod(int count) { return 0; } // 컴파일 에러 } 이런 컴파일 에러 메시지를 보게 됩니다. error CS0111: Type 'TestClass' already defines a member called 'MyMethod' with the same parameter types 얼핏 보면 이상해 보여도, 여러분들이 컴파일러 개발자라고 가정하고 다음의 코드를 어떤 메서드에 바인딩해야 할지 결정하는 순간이 되면, MyMethod(5); // (short MyMethod)? (int MyMethod)? 아마도 그 제약은 당연한 것이라고 자연스럽게 수긍이 될 것입니다. 이러한 제약이, 상속 관계의 반환 타입으로 오면 상황이 다소 달라집니다. using System; class Program { static void Main(string[] args) { Product prd = new Headset().GetDevice(); Headset hds = new Headset().GetDevice(); } } public class Product { public virtual Product GetDevice() { return this; } } public class Headset : Product { // C# 8.0 이전 컴파일 오류 // C# 9.0 + .NET 5 환경에서 컴파일 가능 public override Headset GetDevice() { return this; } } C# 8.0까지는 위와 같이 재정의한(override) 메서드의 경우, 반환 타입이 설령 하위 타입에 해당하더라도 무조건 "Error CS0508 'Headset.GetDevice()': return type must be 'Product' to match overridden member 'Product.GetDevice()'" 컴파일 오류가 발생했지만, C# 9.0부터는 이런 제약이 풀렸습니다. 이것을 달리 말하면 "C# 메서드의 반환 타입에 공변을 허용한다."라고 표현합니다. 재미있는 것은 위의 소스 코드를 C# 9.0 + (.NET Core 3.1 이하 또는 .NET Frmaework의 모든) 버전에서 컴파일할 때 발생하는 오류 메시지입니다. Error CS8830 'Headset.GetDevice()': Target runtime doesn't support covariant return types in overrides. Return type must be 'Product' to match overridden member 'Product.GetDevice()' 즉, 공변 반환 타입의 제약은 C# 언어만의 문제가 아니라 CLR 런타임 쪽에서도 허용을 하지 않았던 것입니다. (첨부 파일은 이 글의 예제 코드를 포함합니다.) [이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.] [다음 글] .NET Framework: 963. C# 9.0 - (12) foreach 루프에 대한 GetEnumerator 확장 메서드 지원(Extension GetEnumerator)[이전 글] VS.NET IDE: 153. 닷넷 응용 프로그램에서의 "My Code" 범위와 "Enable Just My Code"의 역할 [연관 글] .NET Framework: 947. C# 9.0 - (1) 대상으로 형식화된 new 식(Target-typed new expressions).NET Framework: 948. C# 9.0 - (2) localsinit 플래그 내보내기 무시(Suppress emitting localsinit flag).NET Framework: 949. C# 9.0 - (3) 람다 메서드의 매개 변수 무시(Lambda discard parameters).NET Framework: 950. C# 9.0 - (4) 원시 크기 정수(Native ints).NET Framework: 951. C# 9.0 - (5) 로컬 함수에 특성 지정 가능(Attributes on local functions).NET Framework: 953. C# 9.0 - (6) 함수 포인터(Function pointers).NET Framework: 956. C# 9.0 - (7) 패턴 일치 개선 사항(Pattern matching enhancements).NET Framework: 958. C# 9.0 - (8) 정적 익명 함수 (static anonymous functions).NET Framework: 959. C# 9.0 - (9) 레코드(Records).NET Framework: 961. C# 9.0 - (10) 대상으로 형식화된 조건식(Target-typed conditional expressions).NET Framework: 963. C# 9.0 - (12) foreach 루프에 대한 GetEnumerator 확장 메서드 지원(Extension GetEnumerator).NET Framework: 964. C# 9.0 - (13) 모듈 이니셜라이저(Module initializers).NET Framework: 965. C# 9.0 - (14) 부분 메서드에 대한 새로운 기능(New features for partial methods).NET Framework: 966. C# 9.0 - (15) 최상위 문(Top-level statements).NET Framework: 974. C# 9.0 - (16) 제약 조건이 없는 형식 매개변수 주석(Unconstrained type parameter annotations) [최초 등록일: 11/7/2020] [최종 수정일: 11/22/2020] 이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다. by SeongTae Jeong, mailto:techsharer at outlook.com 비밀번호 댓글 작성자 2020-11-09 10시46분 C# 9.0: 공변 리턴 타입 (Covariant return type)http://www.csharpstudy.com/latest/CS9-covariant-return.aspx 정성태 ... 106 107 108 109 110 111 112 113 114 115 116 [117] 118 119 120 ... NoWriterDateCnt.TitleFile(s) 11106정성태11/8/201630308.NET Framework: 623. C# - PeerFinder를 이용한 Wi-Fi Direct 데이터 통신 예제 [2]111105정성태11/8/201625637.NET Framework: 622. PeerFinder Wi-Fi Direct 통신 시 Read/Write/Dispose 문제11104정성태11/8/201623674개발 환경 구성: 305. PeerFinder로 Wi-Fi Direct 연결 시 방화벽 문제11103정성태11/8/201624747오류 유형: 370. PeerFinder.ConnectAsync의 결과 값인 Task.Result를 호출할 때 System.AggregateException 예외 발생11102정성태11/8/201625143오류 유형: 369. PeerFinder.FindAllPeersAsync 호출 시 System.UnauthorizedAccessException 예외 발생11101정성태11/8/201626281.NET Framework: 621. 닷넷 프로파일러의 오류 코드 - 0x8013136311100정성태11/7/201635037개발 환경 구성: 304. Wi-Fi Direct 지원 여부 확인 방법 [1]11099정성태11/7/201636439.NET Framework: 620. C#에서 C/C++ 함수로 콜백 함수를 전달하는 예제 코드111098정성태11/7/201625713오류 유형: 368. 빌드 이벤트에서 robocopy 사용 시 $(TargetDir) 매크로를 지정하는 경우 오류 발생11097정성태11/7/201628045오류 유형: 367. go install: no install location for directory [...경로...] outside GOPATH11096정성태11/6/201631124디버깅 기술: 83. PDB 파일을 수동으로 다운로드하는 방법11095정성태11/6/201628776.NET Framework: 619. C# - Cognitive Services 중의 하나인 Face API를 사용해 얼굴 인식 및 흐림(blur) 효과 적용 [1]111094정성태11/5/201629734VC++: 105. Visual Studio 2013/2015 - Ceemple OpenCV 확장을 이용한 웹캠 영상 출력11093정성태11/4/201630068웹: 34. Edge 브라우저도 지원하는 클립보드 복사를 위한 자바스크립트 코드11092정성태11/3/201637380.NET Framework: 618. C# - NAudio를 이용한 MP3 파일 재생 [5]111091정성태11/3/201629810VC++: 104. std::call_once를 이용해 thread-safe한 Singleton 객체 생성111090정성태11/1/201631461VC++: 103. C++ CreateTimerQueue, CreateTimerQueueTimer 예제 코드 [9]111089정성태11/1/201632373디버깅 기술: 82. Windows 10을 위한 Symbol(PDB) 파일 내려받는 방법 [2]11088정성태11/1/201634115.NET Framework: 617. C# - AForge.NET을 이용한 MP4 동영상 파일 재생 [7]111087정성태11/1/201628633.NET Framework: 616. AForge.Video.FFMPEG를 최신 버전의 ffmpeg 파일로 의존성을 변경하는 방법111086정성태11/1/201623264오류 유형: 366. The Microsoft Passport Container service terminated with the following error: General access denied error11085정성태10/27/201638702.NET Framework: 615. C# - AForge.NET을 이용한 웹캠 영상 출력 [2]111084정성태10/26/201626299오류 유형: 365. The User Profile Service service failed to the sign-in.11083정성태10/26/201632855Windows: 131. 윈도우 10에서 사라진 "Adapters and Bindings" 네트워크 우선 순위 조정 기능 [1]11082정성태10/26/201636100.NET Framework: 614. C# - DateTime.Ticks의 정밀도 [4]111081정성태10/26/201625061오류 유형: 364. You need to fix your Microsoft Account for apps on your other devices to be able to launch apps and continue experiences on this device. ... 106 107 108 109 110 111 112 113 114 115 116 [117] 118 119 120 ...