유형 'String'을 'int?'로 변환 할 수 없습니다. 참조 변환, 권투 변환, Unboxing 변환, 랩핑 변환 또는 널 유형 변환을 통해

StackOverflow https://stackoverflow.com/questions/887943

  •  23-08-2019
  •  | 
  •  

문제

C# 다음을 수락합니다.

object o = "hello";
int? i = o as int?;

if (i == null) {
    // o was not a boxed int
}
else {
    // Can use i.Value to recover the original boxed value
}

하지만

String o = "hello";
int? i = o as int?;

if (i == null) {
    // o was not a boxed int
}
else {
    // Can use i.Value to recover the original boxed value
}

키워드의 동작에 대해 궁금합니다 as C#에서.

Java와 동일하게 이것은 실패합니다.

Object test1 = "hello";
Integer test2 = (Integer) test1;
String test3 = "hello";
Integer test4 = (Integer) test3; //compilation error
도움이 되었습니까?

해결책

컴파일러는 문자열이 결코 int? 그래서 그것은 당신에게 그것을 알려줍니다. 그렇다고해서 그 의미는 아닙니다 int? 유용하지 않습니다. 당신의 시도 된 사용 사례는 정상적인 사용 사례와는 거리가 멀다. 정상적인 것은 "정수를 나타내고 싶고 그 값이 누락/알 수 없을 가능성"입니다. 그에 대한, int? 매우 잘 작동합니다.

왜 당신은 예상하다 원래 코드가 작동합니까? 왜 도움이 될까요?

당신은 주목하십시오 ~할 수 있다 사용 as 무효 유형의 Unboxing :

object o = "hello";
int? i = o as int?;

if (i == null)
{
    // o was not a boxed int
}
else
{
    // Can use i.Value to recover the original boxed value
}

편집 : 귀하의 의견을 본 후에는 사용하지 않습니다. as 물건을 구문 분석합니다. 당신은 아마 사용하고 싶을 것입니다 int.TryParse:

string text = "123":
int value;
if (int.TryParse(text, out value))
{
    Console.WriteLine("Parsed successfully: {0}", value);
}
else
{
    Console.WriteLine("Unable to parse text as an integer");
}

문자열이 정수가되어야한다고 확신한다면 (즉, 그렇지 않으면 버그입니다) 만 사용할 수 있습니다. int.Parse:

int value = int.Parse(text);

구문 분석이 실패하면 예외가 발생합니다.

이 두 가지 방법을 사용하면 숫자가 해당 형식 (예 : 수천 개의 분리기)으로 표현되는 방식을 표현할 수있는 형식 공급자 (일반적으로 문화 정보)를 지정할 수 있습니다.

편집 : 새로운 질문에 대한 답변으로 컴파일러는 문자열이 할 수 없다는 것을 알기 때문에이를 방지합니다. 혹시 박스형 int- 변환은 결코 성공하지 못할 것입니다. 원래 값이 객체라는 것을 알면 ~할 것 같다 성공하십시오.

예를 들어, 내가 당신에게 말했다. "여기에 모양이있다 : 그것은 정사각형입니까?" 그것은 현명한 질문입니다. 물어 보는 것이 합리적입니다. 모양을 보지 않고는 말할 수 없습니다.

그러나 "여기에 삼각형이 있습니다 : 정사각형인가요?" 그런 다음 삼각형이 정사각형이 될 수 없기 때문에 내 얼굴에 웃을 자격이있을 것입니다. 질문은 말이되지 않습니다.

다른 팁

int? 다른 유형의 변수를 포함 할 수있는 int가 아닌 무효 정수 유형을 의미합니다.

int 또는 문자열을 포함 할 수있는 가변 유형을 원한다면 객체 또는 내가 생각하는 문자열을 사용한 다음 유형 캐스팅으로 가득 찬 삶을 살아야합니다. 그래도 왜 그렇게하고 싶은지 모르겠습니다.

int? 정수 값 또는 널 값을 저장할 수 있습니다. "얼마나 많은 명령 이이 사람을 배치했는지"라는 질문에 대한 답변에 대한 답변은 여러 명령 대신 합법적으로 "내가 모른다"또는 "이 사람이 결코 알지 못하는 사실을 알 수 있습니다. 주문했다 ".

추가 정보를 추가하고 싶습니다.

다른 경우, 캐스트가 유효하지 않고 컴파일러가 컴파일에 오류를 던지는 이유 System.String 표시됩니다 봉인. 따라서 컴파일러는 어떤 유형을 알고 있습니다 System.String 상속자 및 당신이 ~처럼-운영자.

키워드로 인해 봉인, 컴파일러는 또한 당신을 알고 있습니다 할 수 없습니다 상속 System.String 기능을 추가하거나 추가 인터페이스를 구현합니다.

아래 코드는 예제이며 컴파일러는 컴파일에 다음 오류를 던집니다.

참조 변환, 권투 변환, Unboxing 변환, 래핑 변환 또는 널 유형 변환을 통해 유형 'SealedClass'를 'IcasttoInterface'로 변환 할 수 없습니다.

public class UnsealedClass {
  // some code
}

public sealed class SealedClass {
  // some code
}

public interface ICastToInterface {
  // some code
}

public class Test {

  public Test() {
    UnsealedClass unsealedClass = new UnsealedClass();

    SealedClass sealedClass = new SealedClass();

    ICastToInterface unsealedCast = unsealedClass as ICastToInterface;  // This works fine

    ICastToInterface sealedCast = sealedClass as ICastToInterface; // This won´t compile, cause SealedClass is sealed
  }
}

그러나 NULL의 값을 확인하여 NULL로 설정할 수 있습니다.

int? blah;
if (blah == null)
{}

int? 무효 정수이며, 캐스팅 및 키워드와는 아무런 관련이 없습니다. "String"은 문자열 유형 객체이며 int (nullable 또는 nullable)로 변환 할 수 없습니다.

AS 키워드는 오류를 반환하지 않는 경우를 제외하고 괄호를 사용하여 캐스팅과 거의 동일합니다. 객체를 NULL로 설정합니다.

int i = 1;

object o = i; //boxing

int j = (int)o; //unboxing

이 첫 번째 예제는 O에 할당 된 객체가 int입니다.

이제 고려 :

string i = "MyString";

object o = MyString;

 int j = (int)o //unboxing raises exception

 int j = o as int; //raises compilation Error as int is not nullable
 int? j = o as int?; /// o == null

그것이 두 개념의 차이를 설명하는 데 도움이되기를 바랍니다.

리차드

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