int i=1;
long longOne=i; //assignment works fine
//...but
bool canAssign=(typeof(long).IsAssignableFrom(typeof(int))); //false
왜 canAssign
이 거짓입니까?유형을 알지 못합니다 .IssignableFrom
int i=1;
long longOne=i; //assignment works fine
//...but
bool canAssign=(typeof(long).IsAssignableFrom(typeof(int))); //false
왜 canAssign
이 거짓입니까?유형을 알지 못합니다 .IssignableFrom
int
을 long
에 할당하면 결과가 암시 적으로 변환됩니다. longOne
은 실제 크기가 인데 (예 : 1L
으로 초기화 한 경우) 드리프트가 발생하는 경우 long
으로 가장하여 int
이 아닙니다. 인
, int
(또는 Int32
) 및 long
(또는 Int64
)의 상속 또는 구현의 관점에서 관련이없는; 둘 다 정수형이므로 변환 가능합니다.
Reflector의 메서드를 보면이 메서드는 호환성보다는 상속을 결정하는 데 사용됩니다. 당신이 인터페이스를 구현하는 클래스가 있다면 당신은 http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx에서 (typeof(interface).IsAssignableFrom(typeof(class))
을 한 경우에
예를 들어 다음 메소드는 true를 반환 :
사실 C와 현재 Type이 같은 유형을 표시하는 경우 또는 현재 Type이 c의 상속 계층 구조에 있거나 현재 Type이 구현하는 인터페이스이거나 c가 제네릭 형식 매개 변수이고 현재 Type이 c의 제약 조건 중 하나를 나타내는 경우에 발생합니다. 조건이 true가 아닌 경우, 또는 c가 null의 경우는 false
마찬가지로 @BoltClock은 암묵적인 변환이라고 말합니다.
IsAssignableFrom
은 유형이 동일하거나 유형이 구현하거나 상속하는 경우 true를 반환합니다.
long
은 int
을 상속하지 않으므로 false를 반환합니다.
int
값을 long
에 할당하면 이는 단지 할당이 아닙니다. 컴파일러는 int
값을 long
값으로 변환하는 코드도 자동으로 추가합니다.
Type.IsAssignableFrom은 .NET Framework 기능이므로 int에서 long에 할당하는 것은 C# 언어입니다. 생성 된 일리노이를 살펴보면 형식 변환 지침이 표시됩니다. CLR 규칙이 C#과 다를 수있는 곳이 많이 있습니다. 한 가지 더 많은 예가 MethodBase.Invoke의 오버로드 해결과 C# 컴파일러에서 수행 된 것입니다.
이 항목은 항상 나를 혼란스럽게합니다. 나는 항상 체크 할 방법을 잊어 버린다. 여기에 남겨주세요 :'var isSameOrChild = baseType.IsAssignableFrom (otherType)' –