كيف يمكنني استخدام التاريخ والوقت.TryParse مع Nullable<DateTime>?

StackOverflow https://stackoverflow.com/questions/192121

  •  08-07-2019
  •  | 
  •  

سؤال

أريد أن استخدام التاريخ والوقت.TryParse طريقة للحصول على قيمة من سلسلة في Nullable.ولكن عندما حاول هذا:

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

المترجم يقول لي

'خارج' الحجة لا تصنف على أنها متغير

ليس متأكدا ما يجب القيام به هنا.لقد حاولت أيضا:

out (DateTime)d.Value 

وأن لا يعمل ايضا.أي أفكار ؟

هل كانت مفيدة؟

المحلول

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

و(قد يكون هناك حلول أكثر أناقة، ولكن لماذا لا يمكنك ببساطة أن تفعل شيئا على النحو الوارد أعلاه؟)

نصائح أخرى

وكما يقول جيسون، يمكنك إنشاء متغير من النوع الصحيح وتمرير ذلك. قد ترغب في تغليف في أسلوب الخاص بك:

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;

وهنا هو طبعة concised قليلا ما اقترح جايسون:

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;
}

ويساعد هذا الأمل :)

تحرير: إزالة (الواضح) بشكل غير صحيح اختبار طريقة التمديد ، لأن (كما أشار بعض سوء حور) طرق الإرشاد التي تحاول تغيير "هذه" المعلمة لن تعمل مع أنواع قيمة.

P. S.السيئة حور في السؤال هو صديق قديم :)

وماذا عن خلق وسيلة التمديد؟

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;

    }
}

وأنا لا أرى لماذا مايكروسوفت لم يعالج هذا. A الذكية القليل طريقة أداة للتعامل مع هذا (كان لي قضية مع كثافة العمليات، ولكن استبدال كثافة مع التاريخ والوقت يكون له نفس التأثير، يمكن أن يكون .....

    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;
        }
    }

وبدلا من ذلك، إذا كنت لا المعنية مع احتمال استثناء المطروحة، هل يمكن تغيير TryParse لتحليل:

DateTime? d = DateTime.Parse("some valid text");

وعلى الرغم من أن لا يكون هناك منطقية تشير إلى نجاح سواء، وأنه يمكن أن يكون عمليا في بعض الحالات حيث كنت تعرف أن إدخال النص سوف يكون دائما صحيحا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top