성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Visual Studio 2019 Preview 4/RC - C# 8.0 Missing compiler required member 'System.Range..ctor'</h1> <p> 현재 2019 (Preview 3은 괜찮고) Preview 4와 RC 버전에서 Range를 사용하면 다음과 같은 컴파일 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Program.cs(21,33,21,38): error CS0656: Missing compiler required member 'System.Range..ctor' </pre> <br /> 이 문제가 roslyn 이슈에도 올라와 있는데요. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > CS0656: Missing compiler required member (.Net Core 3.0 Preview 2, Visual Studio 2019 Preview) #2364 ; <a target='tab' href='https://github.com/dotnet/core/issues/2364'>https://github.com/dotnet/core/issues/2364</a> </pre> <br /> 문제의 원인은 Preview4/RC에 들어가 있는 C# 8.0 컴파일러가 System.Range의 생성자를 접근하도록 바뀌었는데 역시 Preview 버전의 .NET Core 3.0에 포함된 System.Runtime.System.Range 타입에는 없기 때문입니다. (아마도 C# 8.0 컴파일러 개발자들은 이미 업데이트된 .NET Core 3.0 preview 버전을 사용하고 있어서 에러가 없었을 것입니다.)<br /> <br /> 이 문제는 다음번 .NET Core 3.0 preview가 나오면 자연스럽게 해결되겠지만 그전까지는 지난 글의 방법에 따라,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C# 8.0의 Index/Range 연산자를 .NET Framework에서 사용하는 방법 및 비동기 스트림의 컴파일 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11835'>http://www.sysnet.pe.kr/2/0/11835</a> </pre> <br /> 다음과 같이 변경된 ranges.cs 파일을 추가해 빌드하는 식으로 우회할 수 있습니다. (2개의 변경 사항이 있습니다.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > namespace System { public readonly struct Index { private readonly int _value; public int Value => _value < 0 ? ~_value : _value; public bool FromEnd => _value < 0; <span style='color: blue; font-weight: bold'>public bool IsFromEnd => _value < 0;</span> public Index(int value, bool fromEnd) { if (value < 0) throw new ArgumentException("Index must not be negative.", nameof(value)); _value = fromEnd ? ~value : value; } public static implicit operator Index(int value) => new Index(value, fromEnd: false); <span style='color: blue; font-weight: bold'>public int GetOffset(int length) { int num = this._value; if (this.IsFromEnd) { num = (int) (num + (length + 1)); } return num; }</span> } public readonly struct Range { public Index Start { get; } public Index End { get; } <span style='color: blue; font-weight: bold'>public Range(Index start, Index end) { this.Start = start; this.End = end; }</span> public static Range Create(Index start, Index end) => new Range(start, end); public static Range FromStart(Index start) => new Range(start, new Index(0, fromEnd: true)); public static Range ToEnd(Index end) => new Range(new Index(0, fromEnd: false), end); public static Range All() => new Range(new Index(0, fromEnd: false), new Index(0, fromEnd: true)); } static class Extensions { public static int get_IndexerExtension(this int[] array, Index index) => index.FromEnd ? array[array.Length - index.Value] : array[index.Value]; public static int get_IndexerExtension(this Span<int> span, Index index) => index.FromEnd ? span[span.Length - index.Value] : span[index.Value]; public static char get_IndexerExtension(this string s, Index index) => index.FromEnd ? s[s.Length - index.Value] : s[index.Value]; public static Span<int> get_IndexerExtension(this int[] array, Range range) => array.Slice(range); public static Span<int> get_IndexerExtension(this Span<int> span, Range range) => span.Slice(range); public static string get_IndexerExtension(this string s, Range range) => s.Substring(range); public static Span<T> Slice<T>(this T[] array, Range range) => array.AsSpan().Slice(range); public static Span<T> Slice<T>(this Span<T> span, Range range) { var (start, length) = GetStartAndLength(range, span.Length); return span.Slice(start, length); } public static string Substring(this string s, Range range) { var (start, length) = GetStartAndLength(range, s.Length); return s.Substring(start, length); } private static (int start, int length) GetStartAndLength(Range range, int entityLength) { var start = range.Start.FromEnd ? entityLength - range.Start.Value : range.Start.Value; var end = range.End.FromEnd ? entityLength - range.End.Value : range.End.Value; var length = end - start; return (start, length); } } } </pre> <br /> 참고로 .NET Core 3.0 프로젝트에서는 위와 같은 소스 코드를 함께 포함하면 타입 충돌 경고가 뜨는데 일단은 무시하면 됩니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
9075
(왼쪽의 숫자를 입력해야 합니다.)