문제

다음 코드는 다음과 같은 컴파일 타임 오류가 발생합니다

유형 'String'을 'int'로 변환 할 수 없습니다.

string name = Session["name1"].ToString();
int i = (int)name;

아래 코드는 성공적으로 컴파일하고 실행됩니다.

string name = Session["name1"].ToString();
int i = Convert.ToInt32(name);

나는 알고 싶다:

  1. 첫 번째 코드가 컴파일 타임 오류를 생성하는 이유는 무엇입니까?

  2. 두 코드 스 니펫의 차이점은 무엇입니까?

도움이 되었습니까?

해결책

(int)foo 단순히 캐스트입니다 Int32 (int C#) 유형. 이것은 CLR에 내장되어 있으며 그것을 요구합니다 foo 숫자 변수입니다 (예 : float, long, 이런 의미에서 C의 캐스트와 매우 유사합니다.

Convert.ToInt32 일반적인 변환 기능으로 설계되었습니다. 캐스팅보다 더 많은 일을합니다. 즉, 전환 할 수 있습니다 어느 원시 유형 a int (특히, 파싱 a string). 이 방법에 대한 오버로드의 전체 목록을 볼 수 있습니다. 여기 MSDN에서.

그리고 AS 스테판 스티거 언급 의견으로:

또한 수치 수준에서 (int) foo 잘립니다 foo (ifoo = Math.Floor(foo)), 동안 Convert.ToInt32(foo) 용도 반쪽에서 반올림 (가장 가까운 정수까지 X.5 라운드, 즉 ifoo = Math.Round(foo)). 결과는 구현 측면뿐만 아니라 수치 적으로도 ~ 아니다 똑같다.

다른 팁

(이 줄은 합병 된 질문과 관련이 있습니다) 절대 사용해서는 안됩니다. (int)someString - 그것은 결코 작동하지 않을 것입니다 (그리고 컴파일러는 당신을 허용하지 않습니다).

하지만, int int.Parse(string) 그리고 bool int.TryParse(string, out int) (그리고 그들의 다양한 과부하)는 공정한 게임입니다.

개인적으로, 나는 주로 만 사용합니다 Convert 내가 반성을 다룰 때, 그래서 나에게 선택은 Parse 그리고 TryParse. 첫 번째는 내가 때입니다 예상하다 유효한 정수가되는 값은 그렇지 않으면 예외를 던지기를 원합니다. 두 번째는 내가 원할 때입니다 확인하다 그것이 유효한 정수 인 경우 - 그렇지 않을 때 무엇을 해야하는지 결정할 수 있습니다.

이것으로부터 인용합니다 에릭 립퍼트 기사:

캐스트는 두 가지 모순적인 것들을 의미합니다. "이 객체가 실제로이 유형인지 확인하십시오. 그렇지 않은 경우 던지십시오"및 "이 개체는 주어진 유형이 아닙니다. 주어진 유형에 속하는 동등한 값을 찾으십시오".

그래서 당신이 1에서하려고했던 것은 yes 끈이 int라고 주장합니다. 그러나 문자열이 int가 아니기 때문에 그 주장은 실패합니다.

이유 2는 성공하기 때문에 convert.toint32 ()가 문자열을 구문 분석하고 int를 반환하기 때문입니다. 예를 들어 여전히 실패 할 수 있습니다.

Convert.ToInt32("Hello");

인수 예외가 발생합니다.

요약하면 문자열에서 int로 변환하는 것은 .NET 유형 시스템에 암시적인 것이 아니라 프레임 워크 문제입니다.

명시 적 주조를 통해 문자열을 int로 캐스트 할 수 없습니다. 사용하여 변환해야합니다 int.Parse.

convert.toint32 기본적 으로이 방법을 랩합니다.

public static int ToInt32(string value)
{
    if (value == null)
    {
        return 0;
    }
    return int.Parse(value, CultureInfo.CurrentCulture);
}

C# 캐스팅 작업 대 .NET 변환 유틸리티에 대해 이야기하고 있습니다.

  • C# 언어 수준 주조 괄호를 사용합니다 - (int) - 유형 간의 암묵적 호환성 또는 개발자가 명시 적으로 정의 된 지침에 의존하여 제한되어 있습니다. 전환 연산자.
  • .NET 프레임 워크에 많은 변환 메소드가 있습니다 (예 : System.convert, 허용하기 위해 변환 동일하거나 이질적인 데이터 유형 사이.

(주조) 구문은 숫자 데이터 유형 및 "호환 가능한"데이터 유형에서도 작동합니다. 호환이라는 것은 상속 (즉, 기본/파생 클래스) 또는 구현 (IE 인터페이스)을 통해 설정된 관계가있는 데이터 유형을 의미합니다.

캐스팅은 또한 이질적인 데이터 유형 사이에서 작동 할 수 있습니다. 전환 연산자 한정된.

그만큼 System.convert 반면에 클래스는 일반적인 의미로 사물을 변환 할 수있는 많은 가용 메커니즘 중 하나입니다. 여기에는 논리적으로 변환하는 논리가 포함되어 있으며, 이는 한 형태에서 다른 양식으로 논리적으로 변경할 수있는 이종, 알려진 데이터 유형을 변환 할 수 있습니다.

변환은 유사한 데이터 유형 사이의 변환을 허용하여 주조와 동일한 근거의 일부를 포함합니다.


C# 언어에는 몇 가지 일을하는 방법이 있습니다.
그리고 기본 .NET 프레임 워크에는 프로그래밍 언어를 제외하고는 고유 한 방법이 있습니다.
(때때로 그들은 의도에 겹칩니다.)

캐스팅을 본질적으로 더 제한된 C# 언어 수준의 기능으로 생각하고 시스템을 통한 변환.

.NET에서 문자열에서 int로 기본 캐스트가 없습니다. int.parse () 또는 int.tryparse ()를 사용하여이를 수행 할 수 있습니다. 또는 당신이 한 것처럼 convert.toint32 ()를 사용할 수 있습니다.

그러나 예에서는 왜 ToString ()을 int로 다시 변환합니까? int를 세션에 저장하고 다음과 같이 검색 할 수 있습니다.

int i = Session["name1"];

간단한 추가 : 다른 상황에서 (예 : Double을 변환하는 경우 & C를 INT32로 변환하는 경우)이 둘 중에서 선택할 때 반올림에 대해 걱정할 수도 있습니다. Convert.INT32는 Banker의 반올림을 사용합니다 (MSDN); (int)는 단지 정수로 잘립니다.

1) C#은 타입 안전 언어이며 문자열을 숫자에 할당 할 수 없습니다.

2) 두 번째 케이스는 문자열을 새로운 변수로 구문 분석합니다. 세션이 asp.net 세션 인 경우 문자열을 저장할 필요가없는 것보다 검색 할 때 다시 변환합니다.

int iVal = 5;
Session[Name1] = 5;
int iVal1 = (int)Session[Name1];

변환 .toint32

    return int.Parse(value, CultureInfo.CurrentCulture);

그러나 (int)는 유형 캐스트이므로 (int) "2"는 문자열을 int로 캐스트 할 수 없기 때문에 작동하지 않습니다. 그러나 convert.toint32 do처럼 구문 분석 할 수 있습니다

차이점은 첫 번째 스 니펫이 캐스트이고 두 번째 스 니펫은 변환이라는 것입니다. 그러나 아마도 컴파일러 오류가 문구로 인해 더 많은 혼란을 제공하고 있다고 생각합니다. 아마도 "유형 '문자열'을 'int'로 캐스트 할 수 없다고 말하면 더 나을 것입니다.

이것은 오래된 것이지만 또 다른 차이점은 (int)가 이중 EJ가있는 경우 숫자를 반올림하지 않는다는 것입니다. 5.7 (int)를 사용하는 OUPUT는 5이고 convert.toint ()를 사용하는 경우 숫자는 다음과 같습니다. 6으로 반올림.

이것은 이미 논의되었지만 dotnetfiddle을 공유하고 싶습니다.

산술 연산을 다루고 플로트, 소수점, 이중 등을 사용하는 경우 convert.toint32 ()를 더 잘 사용해야합니다.

using System;

public class Program
{
  public static void Main()
  {
    double cost = 49.501;
    Console.WriteLine(Convert.ToInt32(cost));
    Console.WriteLine((int)cost);
  }
}

산출

50
49

https://dotnetfiddle.net/m3dddq

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