[c#] Nullable <DateTime>과 함께 DateTime.TryParse를 어떻게 사용합니까?

DateTime.TryParse 메서드를 사용하여 문자열의 datetime 값을 Nullable로 가져오고 싶습니다. 그러나 이것을 시도하면 :

DateTime? d;
bool success = DateTime.TryParse("some date text", out (DateTime)d);

컴파일러는 나에게 말한다

‘out’인수는 변수로 분류되지 않습니다.

여기서 무엇을해야하는지 잘 모르겠습니다. 나는 또한 시도했다 :

out (DateTime)d.Value 

그리고 그것도 작동하지 않습니다. 어떤 아이디어?



답변

DateTime? d=null;
DateTime d2;
bool success = DateTime.TryParse("some date text", out d2);
if (success) d=d2;

(더 우아한 솔루션이있을 수 있지만 위와 같이 간단히 수행하지 않는 이유는 무엇입니까?)


답변

Jason이 말했듯이 올바른 유형의 변수를 만들고 전달할 수 있습니다. 자신의 방법으로 캡슐화 할 수 있습니다.

public static DateTime? TryParse(string text)
{
    DateTime date;
    if (DateTime.TryParse(text, out date))
    {
        return date;
    }
    else
    {
        return null;
    }
}

… 또는 조건부 연산자가 마음에 들면 :

public static DateTime? TryParse(string text)
{
    DateTime date;
    return DateTime.TryParse(text, out date) ? date : (DateTime?) null;
}

또는 C # 7 :

public static DateTime? TryParse(string text) =>
    DateTime.TryParse(text, out var date) ? date : (DateTime?) null;


답변

다음은 Jason이 제안한 내용에 대한 약간 간결한 버전입니다.

DateTime? d; DateTime dt;
d = DateTime.TryParse(DateTime.Now.ToString(), out dt)? dt : (DateTime?)null;


답변

Nullable<DateTime>은 (는) 다른 유형 이기 때문에 할 수 없습니다 DateTime. 이를 수행하려면 자체 함수를 작성해야합니다.

public bool TryParse(string text, out Nullable<DateTime> nDate)
{
    DateTime date;
    bool isParsed = DateTime.TryParse(text, out date);
    if (isParsed)
        nDate = new Nullable<DateTime>(date);
    else
        nDate = new Nullable<DateTime>();
    return isParsed;
}

도움이 되었기를 바랍니다 🙂

편집 :
“this”매개 변수를 변경하려는 확장 메서드가 값 형식에서 작동하지 않기 때문에 (분명히) 부적절하게 테스트 된 확장 메서드를 제거했습니다.

PS 문제의 나쁜 후 어는 오랜 친구입니다 🙂


답변

확장 방법을 만드는 것은 어떻습니까?

public static class NullableExtensions
{
    public static bool TryParse(this DateTime? dateTime, string dateString, out DateTime? result)
    {
        DateTime tempDate;
        if(! DateTime.TryParse(dateString,out tempDate))
        {
            result = null;
            return false;
        }

        result = tempDate;
        return true;

    }
}


답변

Microsoft가 왜 이것을 처리하지 않았는지 모르겠습니다. 이 문제를 처리하는 똑똑한 작은 유틸리티 방법 (int에 문제가 있었지만 int를 DateTime으로 바꾸는 것은 동일한 효과가 될 수 있습니다.

    public static bool NullableValueTryParse(string text, out int? nInt)
    {
        int value;
        if (int.TryParse(text, out value))
        {
            nInt = value;
            return true;
        }
        else
        {
            nInt = null;
            return false;
        }
    }


답변

이것은 당신이 찾고있는 하나의 라이너입니다.

DateTime? d = DateTime.TryParse("some date text", out DateTime dt) ? dt : null;

적절한 TryParse 의사 확장 방법으로 만들고 싶다면 다음과 같이 할 수 있습니다.

public static bool TryParse(string text, out DateTime? dt)
{
    if (DateTime.TryParse(text, out DateTime date))
    {
        dt = date;
        return true;
    }
    else
    {
        dt = null;
        return false;
    }
}