ProgramingTip

"값 유형과 'null'의 가능한 비교"는 어떻게해야합니까?

bestdevel 2020. 10. 30. 08:19
반응형

"값 유형과 'null'의 가능한 비교"는 어떻게해야합니까?


커스텀 NUnit Constraint에 대해이 메서드를 작성하는 동안.

    private void AddMatchFailure<TExpected, TActual>(string failureName, TExpected expected, TActual actual)
    {
        _matchFailures.Add(
            String.Format(MatchFailureFormat, failureName,
            (expected == null) ? "null" : expected.ToString(),
            (actual == null) ? "null" : actual.ToString()));
    }

ReSharper에서 그에게 경고 expected하고 actual있을 ValueType것입니다.

예 : TExpected는 DateTime입니다.
   예상 == null; // 그러나 DateTime은 신입니다.

ValueType을 null과 중요 할 때 규칙은 무엇이며 클래스 제약 조건을 추가하여 일반 매개 변수를 제한하지 않고 그것을 설명하는 메소드를 어떻게 작성해야합니까?


코드를 변경하지 말고 경고 만 무시하십시오. 유형 매개 변수가 nullable이 아닌 값 유형 인 경우 비교는 항상 실패하고 항상 ToString()대신 호출 됩니다. 나는 그것이 중요한 것이 JITted인지 여부는 모르지만 놀라지 않을 것입니다 ... 그리고 이것은 어쨌든 성능에 코드처럼 들리지 않습니다 :)

개인적으로 경고를 "켜짐"으로 두고두고이 특별한 경우에는 무시합니다.

LINQ to Objects를 다시 구현할 때 동일한 경고가 몇 번 발생했다고 생각합니다.


ValueType을 null과 중요 할 때 규칙은 무엇이며 클래스 제약 조건을 추가하여 일반 매개 변수를 제한하지 않고 그것을 설명하는 메소드를 어떻게 작성해야합니까?

참조 유형이 될지 모르는 경우 다음과 같이 말할 수 있습니다.

private void AddMatchFailure<TExpected, TActual>(
    string failureName,
    TExpected expected,
    TActual actual
) {
    _matchFailures.Add(
        String.Format(MatchFailureFormat, failureName,
        IsDefault<TExpected>(expected) ? DefaultStringForType<TExpected>() : expected.ToString(),
        IsDefault<TActual>(actual) ? DefaultStringForType<TActual>() : actual.ToString()
    );
}

private bool IsDefault<T>(T value) {
    if(typeof(T).IsValueType) {
        return default(T).Equals(value);
    }
    else {
        return Object.Equals(null, value);
    }
}

private string DefaultStringForType<T>() {
    if(typeof(T).IsValueType) {
        return default(T).ToString();
    }
    else {
        return "null";
    }
}

제네릭 유형에서 null을 확인하기 위해 다음과 같은 것을 사용하고 있습니다.

if (Equals(result, Default(T)))

private void AddMatchFailure<TExpected, TActual>(string failureName, TExpected expected, TActual actual)
{
    _matchFailures.Add(
        String.Format(MatchFailureFormat, failureName,
        (expected == default(TExpected)) ? "null" : expected.ToString(),
        (actual == default(TActual)) ? "null" : actual.ToString()));
}

해야합니다.

default(T)null 인 참조 유형의 해당 유형의 경우를 제공합니다. (Enums (enumType)0는 예를 들어 동일합니다 ).

참고 URL : https://stackoverflow.com/questions/5340817/what-should-i-do-about-possible-compare-of-value-type-with-null

반응형