2012-12-19 3 views
4

에 파생 클래스를 캐스팅 할 수 없습니다나는 내 수업에 몇 가지 대화 상자를 가지고 있고이 기능을 초기화하기 위해 노력하고있어 그 기본 유형

error CS1503: Argument 1: cannot convert from 'ref Microsoft.Win32.OpenFileDialog' to 'ref Microsoft.Win32.FileDialog'

InitializeFileDialog(ref dialog); 

나는 캐스팅을 시도하지만 어떤 이유로 수 없습니다. 뭐가 문제 야? FileDialog이 추상적인가? 나는 그것이 이유인지 찾는 것을 시도했지만 유용한 것을 찾을 수 없었다. 여기

Microsoft.Win32에서 발견되는 선언이다 : 나는 또한 제네릭을 사용하려고

public abstract class FileDialog : CommonDialog 
public sealed class OpenFileDialog : FileDialog 

그것은 작동하지 않았다. 내가 뭘 놓치고 있니?

+3

'ref' 키워드를 제거하십시오. 객체는 참조로 전달되므로 위의 예에서는 객체가 필요하지 않습니다. – adrianbanks

+0

@adrianbanks 문제가 해결되었습니다! 고맙습니다. 그러나 왜 그것이 오류를 던 졌는가? – MasterMastic

+0

@adrianbanks는 정확하지만,'ref'는 전달 된 변수에 다른 객체를 할당 할 수 있다는 점에 유의할 필요가 있습니다. 따라서 어떤 경우에는 객체를 전달할 때 유용합니다. 객체 변수에'null '을 할당해도 원래의 객체는 함수 범위 밖에서 바뀌지 않습니다. 자세한 내용은 http://stackoverflow.com/questions/186891/why-use-ref-keyword-when-passing-an-object를 참조하십시오. –

답변

4

가장 좋은 해결책은 ref 키워드를 제거하는 것입니다. 이 경우에는 실제로 필요하지 않습니다.

refref 사용자가 전달한 변수를 재 할당 할 수 있어야하는 경우 거의 불가능해야합니다. 값을 반환하거나 개체 그대로 직접 작업하는 것이 일반적으로 충분합니다.

그러나 컴파일러 오류는 메서드에서 필요로하는 정확한 형식의 변수를 전달해야한다는 사실에서 비롯됩니다. 이처럼 모든 후

FileDialog baseDialog = fileDialog; 
// baseDialog might be a different object when this returns 
InitializeFileDialog(ref baseDialog); 

, ref 매개 변수로 전달되는 원래의 변수가 당신의 방법으로 재 할당 할 수 있습니다.

OpenFileDialog 원래 변수에 SaveFileDialog을 할당하면 어떻게 될까요? 우리가 알고있는 세상은 끝날 것입니다. 그렇기 때문에 FileDialog 유형의 임시 변수를 만들어야합니다. type 시스템을 사용하면 메서드에서 파생 클래스의 객체를 해당 변수에 할당 할 수 있습니다. 어쨌든
Why do ref and out parameters not allow type variation?

:

이 흥미로운 주제에 대한 추가 정보를 원하시면 에릭 Lippert의에 의해이 블로그 항목을 참조하십시오이 경우 ref를 사용하지 마십시오.

+0

'ref'가 제거되었지만 컴파일러가 오류를 던진 이유를 찾으려고합니다. 나는 당신이 처음 언급 한 것처럼 그것을 던지기조차 할 수 없었다. – MasterMastic

+0

@Ken 매개 변수가'ref'로 전달되면 메서드는 ** 원래 ** 변수를 재 할당 할 수 있기 때문입니다. 다른 변수를 형변환하면 다시 할당 된 새 값을 저장하는 새 변수를 만들지 않습니다. – Botz3000

+0

오, 이제 알겠습니다! 컴파일러가 그것에 대해 더 명확 해지기를 기대했다. 어쨌든, 고마워요! C++로 대부분의 시간을 보내고 있습니다. 그런 클래스는 그런 연산자가없는 참조입니다. – MasterMastic

0

문제는 ref 키워드에 있습니다. 호출자의 참조를 바꿀 수 있습니다. 예를 들어

: SaveFileDialogFileDialog 때문에 SomeFunction에서

static void Main(string[] args) 
{ 
    OpenFileDialog dialog = new OpenFileDialog(); 

    SomeFunction(ref dialog); 
} 

static void SomeFunction(ref FileDialog obj) 
{ 
    obj = new SaveFileDialog(); 
} 

코드는 유효합니다

static void Main(string[] args) 
{ 
    string str = "hello"; 

    SomeFunction(ref str); 

    Console.WriteLine(str); // outputs "world" 
} 

static void SomeFunction(ref string obj) 
{ 
    obj = "world"; 
} 

는 이제 기본 클래스를 사용할 수 상상, 당신은이 상황이있을 것이다. 그러나 Main 함수에서 SaveFileDialogOpenFileDialog에 할당하는 것은 불가능합니다. 그렇기 때문에 ref 키워드를 사용할 때는 정확히 같은 유형의 참조를 제공해야합니다.

귀하의 경우 문제를 해결하려면 ref 키워드를 삭제하십시오.

관련 문제