문제

내가하고 싶은 일은 다음과 같습니다.

XmlWriter writer = XmlWriter.Create(
    (string.IsNullOrEmpty(outfile) ? Console.Out : outfile)
);

그러나 "System.io.textWriter '와'string '사이에 암시 적 변환이 없기 때문에"조건부 표현 유형은 결정할 수 없습니다. " 위 코드는 다음의 단순화입니다.

XmlWriter writer;

if (string.IsNullOrEmpty(outfile))
{
    writer = XmlWriter.Create(Console.Out); // Constructor takes TextWriter
}
else
{
    writer = XmlWriter.Create(outfile); // Constructor takes string
}

이 두 전화 Create 완벽하게 유효 하며이 컴파일됩니다. 인라인 테스트를하려고했던 것처럼 이것을보다 컴팩트하게 만드는 방법이 있습니까?

내가 원하는 것이 작동하지 않는다는 것은 나에게 의미가 없습니다. 이것을 통해 정신적으로 생각하면, 컴파일러가 평가하는 것처럼 보입니다. string.IsNullOrEmpty(outfile) 어떤 경우를 복용 할 것인지 결정하기 위해 :

  • 조건이 사실이라면 Console.Out, 그리고 다형적으로 버전을 선택해야한다는 것을 알 수 있습니다. XmlWriter.Create 텍스트 작가가 필요합니다.
  • 조건이 거짓이라면 outfile, 그리고 다형적으로 버전을 선택해야한다는 것을 알 수 있습니다. XmlWriter.Create 스트링이 필요합니다.

ML의 프로그래밍이 내 뇌를 뒤틀 었습니까?

도움이 되었습니까?

해결책

그렇게 할 수없는 이유는 컴파일러가 컴파일 시간에 사용할 수있는 과부하를 선택해야하기 때문입니다. 접근 방식은 런타임에 수행해야합니다. 당신이 그것을 만들 수있는 가장 짧은 것은 아마도 다음과 같습니다.

XmlWriter writer = String.IsNullOrEmpty(outfile)
    ? XmlWriter.Create(Console.Out)
    : XmlWriter.Create(outfile);

다른 팁

모두가 다음을 제안하는 것 같습니다.

XmlWriter writer = String.IsNullOrEmpty(outfile)
    ? XmlWriter.Create(Console.Out)
    : XmlWriter.Create(outfile);

그러나 이것은 또한 가능합니다.

XmlWriter writer = XmlWriter.Create(string.IsNullOrEmpty(outfile)
    ? Console.Out : new StreamWriter(outfile));

후자는 원래 시도에 더 가깝고 IMO, 더 컴팩트합니다.

C# 컴파일러는 컴파일 중에 정적으로 실행하는 메소드를 선택합니다. 컴파일 할 때 생성되는 IL은 특정 방법에 대한 참조입니다. 다형성 부분은 실행할 특정 기능의 구현을 선택할 때 런타임에 제공됩니다.

귀하의? : 명령문은 런타임에 평가되므로 컴파일러는 어떤 방법을 실행 해야하는지 알 수 없습니다.

이것으로 변경하면 작동합니다.

XmlWriter writer = string.IsNullOrEmpty(outfile) ? 
    XmlWriter.Create(Console.Out) :
    XmlWriter.Create(outfile);

문제는 컴파일 시간에 무엇을 결정할 수 없다는 것입니다.

(string.IsNullOrEmpty(outfile) ? Console.Out : outfile)

돌아와야합니다. 문자열이 될 것인가 아니면 텍스트 라이터가 될까요? 런타임에만 결정될 수 있으므로 컴파일 오류가 발생하므로? 운영자는 컴파일 시간에 해결해야합니다.

당신이 얻을 수있는 최선은 아마도 다음과 같습니다.

XmlWriter writer = string.IsNullOrEmpty(outfile)
    ? XmlWriter.Create(Console.Out)
    : XmlWriter.Create(outfile);

여기서 몇 가지 일이 일어나고 있습니다.

첫째, "예외"는 3 차 연산자 (TM)로 인해 발생합니다. 문제는 단일 공통 기본 유형 (객체 이외의)으로 해결할 수없는 두 가지 다른 유형을 반환하려는 단일 표현식을 가지고 있기 때문입니다.

또한 생성자 과부하는 어떠한 방식으로도 관련이없는 두 가지 완전히 다른 유형을 취할 수 있습니다. C# 컴파일러는 매우 매우 똑똑하지만 그다지 그렇지 않습니다 저것 똑똑한.

아니요, 두 개의 개별 생성자이므로 두 개의 별도 전화를해야합니다.

컴파일 시간에 통화 할 오버로드가 결정되므로 런타임에 데이터 유형을 선택하여 다른 과부하를 호출 할 수 없습니다.

또한 조건부 운영자는 단일 데이터 유형 만 반환 할 수 있으며 선택에 따라 다른 데이터 유형을 반환 할 수 없습니다.

C#은 정적으로 입력됩니다. 모든 다형성 마법은 컴파일 시간이 발생합니다. 조건부 표현의 유형은 컴파일 시간에 알려지지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top