2009-04-01 4 views
1

또는 "내가 잘못 했나요?"컴파일러에서 왜 이런 복잡한 구문을 필요로합니까?

필자는 필요한 경우 문자열을 반환하는 작은 함수를 작성하고 있습니다 (따옴표 붙이기 가능). 그렇지 않으면 그대로 반환합니다. 문자가 함수에 입력됩니다. 결과는 문자열입니다. 내가 처음에해야 할 노력은 무엇

했다 :

private string QuotedChar(char ch) { 
    if(ch < (char)128 && !char.IsWhiteSpace(ch)) 
     return(new string(ch)); 

    // ... 
} 

그러나, 컴파일러는 CS0214, "포인터 고정 크기 버퍼는 안전하지 않은 상황에서 사용될 수있다"라고, 돌려 문을 컴파일 할 때. 대신 코드를 변경하면 :

private string QuotedChar(char ch) { 
    if(ch < (char)128 && !char.IsWhiteSpace(ch)) 
     return(new string(new char[] { ch })); 

    // ... 
} 

... 잘 작동합니다. 그러나 그것은 다소 무의미한 것처럼 보입니다. 포인터 나 고정 된 크기의 버퍼를 사용하려고하는 이유를 이해하지 못합니다. 단지 char 일뿐입니다. 내가 바보 같은 것을 놓친 건가요? 아니면이게 문제입니까/벌레입니까?

참고로,이 문서는 Microsoft .NET Framework가 아닌 Mono 2.0입니다. Windows를 실행하지 않기 때문에 Microsoft C# 컴파일러가 없어도 동일한 작업을 수행하는지 알 수 없으므로 버그인지 궁금합니다.

답변

7

글쎄, 컴파일되지 않는 버그는 아닙니다. char을 사용하는 문자열 생성자 오버로드가 없습니다. 나는 Mono가 당신이 string(char*) 생성자를 의미한다고 생각하고 그것을 시도했다 - 오류로 이어진다.

stringchar 변환하는 간단한 방법은 간단하지만 ToString() 전화이다

private string QuotedChar(char ch) { 
    if(ch < (char)128 && !char.IsWhiteSpace(ch)) 
     return ch.ToString() 

    // ... 
} 

단말 C# 컴파일러가 같은 과부하 추측되지만 다른 오류 메시지 제공 :

을 Test.cs (8,20) : 오류 CS1502 : 에 대한 오버로드 된 메서드 중 가장 적합한 것은 'string.String(char*)'에 일치합니다. 일부 잘못된 인수
Test.cs (8,31) : 오류 CS1503 : 인수 '1': 하나의 문자를 사용하는 생성자가없는 'char'에서 'char*'

+0

A-ha. 그거야. 재미있는; Mono는 MSDN에서 찾지 못했지만 char을 사용하는 생성자를 보여주었습니다. 나는 당신이 MonoDevelop의 완료 테이블에 'char *'를 표시하지 않기 때문에 포인터가 맞을 것으로 생각합니다. 감사! –

+0

나는 그것이 가능한 과부하를 잘못 보여주는 MonoDevelop 버그라고 생각합니다. –

+0

그런 식으로 보일 것입니다. Subversion에서 트리를 빌드하자마자 바로 버그 리포트를 제출할 것입니다. –

1

System.String로 변환 할 수 없습니다.

는 두 가지 가능성이 있습니다

String(Char*) 

또는

String(Char[]) 

두 번째 옵션이 작동하는 이유이며, 첫 번째는 포인터 (안전하지 않은)을 전달하려고 생각합니다.

0

단일 문자를 사용하는 new string()에 대한 과부하가 없습니다. 당신이 실제로 얻는 것은 char *을 취하는 과부하입니다. 즉, null로 끝나는 문자 배열에 대한 포인터를 기대하지만 포인터는 안전하지 않은 상황에서만 허용됩니다.

오히려 배열을 만드는 대신, 당신은 할 수 new string(ch, 1)

0
내가 "() ch.ToString를 돌려" 문자열 하나를 사용하는 생성자가없는 당신을 "새 문자열 (채널)을 반환"바꿀 것

숯. 그러나 그것은 char와 count를 취하는 것이 있습니다.

"new string (ch, 1)"을 사용하여 ch 변수에있는 문자 1 개를 포함하는 문자열을 만들 수 있습니다.

2

.NET에서 컴파일 된 동일한 코드는 매개 변수로 char을 사용하는 문자열 생성자에 대한 오버로드가 없다는 오류 메시지를 표시합니다. 가장 가까운 일치는 char에 대한 포인터를 취하는 것이므로 Mono에서 그 오류 메시지를 얻는 이유가 될 수 있습니다.

당신은 문자와 수를 걸리는 과부하를 사용할 수 있습니다

return new String(ch, 1); 

아니면 ToString 메서드 사용할 수 있습니다

return ch.ToString(); 

또는 정적 ToString 메서드 :

return Char.ToString(ch); 
관련 문제