유형 'String'을 'int?'로 변환 할 수 없습니다. 참조 변환, 권투 변환, Unboxing 변환, 랩핑 변환 또는 널 유형 변환을 통해
-
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
그것이 두 개념의 차이를 설명하는 데 도움이되기를 바랍니다.
리차드