C # : 코드 부분 :
class ConstValues
{
public const int NULL=1;
}
class Example
{
private enum FormatFunction
{
Date,
Unknown
}
...
FormatFunction returnValue = fn();
...
이제 두 가지 시나리오가 있습니다.
이 방법을 사용하여 반환 코드를 값과 비교할 때
if (!returnValue.Equals(ConstValues.NULL))
{
...
컴파일 시간 오류가 발생하지 않습니다 (그리고 이것이 제가 놓친 버그이기 때문에 코드가 의도 한대로 작동하지 않습니다).
하지만 내가 바꿀 때
if (returnValue != ConstValues.NULL)
{
...
컴파일 시간 오류가 발생하고 내가 한 실수를 발견했습니다.
enum의 기본 구조가 int라는 것을 이해하지만 Equals를 사용할 때도 컴파일 시간 오류가 발생합니다.
첫 번째 방법은 통과하고 두 번째 방법은 통과하지 못하는 이유는 무엇입니까?
!=
언어 규칙이므로 C #에만 해당됩니다. 이 연산자를 호출하는 것은 얼리 바운드입니다 . 즉, 컴파일 타임에 발생합니다.
Equals
은 프레임 워크 규칙 (이 경우 .NET)이며 런타임시 바인딩됩니다.
를 호출하면 !=
컴파일 중에 C # 컴파일러에서 결정을 내리므로 오류가 발생합니다. 호출 Equals
하면 런타임에 프레임 워크가 결정합니다. 열거 형이 객체 유형이 아니기 때문에 객체 (boxing)로 변환 된 다음 런타임은 유형이 Equals
메소드 를 재정의했는지 확인합니다. 그렇지 않았으므로 기본 구현을 사용합니다.
Equals
참조 유형
인스턴스가 참조 유형 인 경우 기본 구현은 Equals
한 개체 참조가 다른 개체 참조와 동일한 지 확인합니다. 동일한 참조 인 경우 true를 반환합니다. 그렇지 않으면 false를 반환합니다.
Equals
값 유형
인스턴스가 값 유형이면 값이 같은지 테스트합니다. 이것이 당신의 경우입니다. 가지고있는 열거 형 값이 상수 값과 같은지 확인합니다. 오류가 표시되거나 발생하지 않습니다. 같거나 같지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다