2009-10-04 2 views
7

제목이 말한대로. Related to this question.C#이 char에 대한 더하기 연산을 정의하지 않는 이유는 무엇입니까?

다음 코드가 작동하지 않는 이유는 무엇입니까? 논리적으로 합리적인 것처럼 보입니다.

string foo = 'a' + 'b'; // Fails with an invalid int -> string conversion 

지금, 위의 링크 된 질문에서 우리가 여기서 무슨 일이 일어나고 있는지 추론 할 수 있습니다 컴파일러는 암시 문자 사용 - 다음 그 값을 추가,> INT 변환. 이것은 char s에 대해 정의 된 더하기 연산이 없어야한다고 믿게합니다! 이것은 사실입니까, 그렇다면 왜 그곳에 없습니까?

EDIT : 일반적 합의는 내가 정의 할 것으로 기대되는만큼 그렇게 정의되지 않은 것이 아니라는 것입니다.

+11

두 개의 문자를 문자열로 변환하는 추가 사항을 의미하는 경우 컴파일러에서 사용자가 원하는 것을 알지 못하기 때문입니다. 부여 된, 그것은 기본 동작으로 추가 할 수 있지만 어쩌면 다른 사람들이 실제로 정수로 추가 할 char 선호합니다 ... 그래서 여기에 첫 번째 char에서 문자열을 인스턴스화 할 것이다 다음 두 번째 char 수동으로 추가 할 수 모든 오해를 피하십시오. – RedGlyph

+0

@redglyph : 대답이라면 나는 그것을 upvote 줄. –

답변

15

먼저 연역 과정에 대한 단어. 공제 - char가 int로 변환되므로 char에 정의 된 더하기 연산자가 없습니다. 그래서 잘 작동합니다. 그러나 공제 과정이 불필요하다는 점에 주목합니다. 모든 내장 연산자를 명확하게 설명하는 7.7.4 절을 읽었을 수 있습니다. 간단히 말해 int + int, uint + uint, long + long, ulong + ulong, float + float, double + double, decimal + decimal, enum-and-underlying 유형, delegate 조합, string + string, string + object 및 객체 + 문자열. (그리고 물론, value 타입을 사용하는 버전의 null-to-nullable 버전) 그렇습니다. 문자를 사용하는 추가 연산자가 없습니다.

둘째로, "왜 안되나요?" - 문자는 좀 이상해. 그들의 저장은 짧은 정수의 저장이지만, 그 의미는 문자열에있는 문자의 의미입니다. 그래서 char은 정수형이나 짧은 문자열로 취급해야합니까?언어 설계자는이 경우 C와 같은 초기 언어의 선두를 따르고 문자열을 사용하지 않는 수학을 할 때 정수와 같은 문자를 처리하기로 결정했습니다. 짧은 문자열처럼 취급하려는 경우 문자를 문자열로 변환 할 수있는 방법은 다양합니다. 빈 문자열을 덧붙이면 다른 대답에서 알 수 있듯이 컴파일러에게 "이 연산은 문자의 정수 값이 아니라 문자열입니다."라고 명확하게 알립니다.

+2

빈 문자열에 추가하는 것은 믿기지 않을만큼 추악한 스타일입니다. String.Concat은 갈 길입니다. –

3

나는 "이유"이라는 단어에 집중해야한다고 생각합니다. C#에서는 두 문자를 추가하는 동작이 "연결"보다는 "유니 코드 값 추가"를 의미하도록 정의되었습니다. 우리는 문자열과 문자가 정수 (예 : The C Programming Language)보다 정수와 훨씬 다른 개체라는 점을 고려하여 "연결"을 의미하는 것으로 합리적으로 정의되었을 수 있습니다.

'a'는 문자 상수입니다. 전통적으로 C에서 적어도 문자 상수는 정수를 나타내는 또 다른 방법이었습니다. 이 경우 정수 ('a'= 97, 'b'= 98 등)의 유니 코드 값입니다. 따라서 식 'a'+ 'b'는이 두 유니 코드 값을 합친 것을 의미합니다. 이미 문자가 문자열이 아닌 정수의 한 형태로 간주되기 때문에 기본적으로 부가 작업이 두 숫자를 추가하는 것이 아니라 상기 한 바와 같이

String foo = "a" + "b"; // double quotes = single-character strings to concatenate 
+1

이 경우 ASCII가 아닙니다. C#에서는 Chars가 유니 코드입니다. –

+0

C#에서는 그 점에서 더 많은 것들이 더 엄격 해졌습니다. 특히,이 작동하지 않습니다 :'char foo = 32;' –

+0

@ 제임스 - 제게 상기시켜 줘서 고마워. 일찍이다. 그에 따라 업데이트 된 게시물. –

3

을, 당신이 기다리고있어 무엇을 달성하기 위해 연결을 수행합니다. 에서는 foo2를 들어

string foo2 = 'a' + "" + 'b'; // Succeeds 
string foo3 = 'a'.ToString() + 'b'.ToString(); // Succeeds 
string foo4 = string.Concat('a', 'b'); // Succeeds 

: 당신이 당신의 원래 의도와 유사한 몇 가지 중 하나를 할 수있는 최대 사용자의 문자는 "추가"를 얻으려면

string str = String.Format("{0}{1}", 'a', 'b'); 
1

:이 같은 문자열에 두 개의 문자를 얻을 수 있습니다 예를 들어 컴파일러에게 빈 문자열을 놓고 암시 적 char을 각 char에 대한 문자열 변환에 개별적으로 적용하여 단서를 제공합니다.

foo3 예제의 경우 각 문자에 ToString 호출을 사용하여 두 개의 문자열을 추가 할 수 있습니다.

0

당신은 문자열 더하기 연산자의 오버로드를 사용하고이 시도 할 수 :

var result = "" + 'a' + 'b'; 

을하지만, 그것은 당신에게 문자열로 변환 INT을 줄 것 같은

var result = 'a' + 'b' + ""; // BAD !!!!! 

와 혼동하지 마십시오 "195"와 같습니다.

문자열의 겹침을 위해 연산자 +의 오버로드를 가져 오는 것이고이를 달성하기위한 첫 번째 인수가 있어야합니다.

그것은 부정 행위와 비슷하지만 C#입니다. - 무의미하고 무자비합니다! (실제로는 .Net은 연산자 (Char, Char)에 대해 연산자 + 오버로드가없고 Int32로 Char를 캐스팅하려고 시도하는 C#입니다).

7

은 당신이 정말 찾고있는 것은 이것이다 :

컴파일러는 어쨌든 문자열의 '+'연산자와 함께 무엇이다
string foo = String.Concat('a', 'b'); 

.

이것은 약 String.Format 작업보다 약 두 배 빠릅니다.

관련 문제