Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将DateTime.TryParse与可为空的<;日期时间>;?_C#_Datetime_Nullable - Fatal编程技术网

C# 如何将DateTime.TryParse与可为空的<;日期时间>;?

C# 如何将DateTime.TryParse与可为空的<;日期时间>;?,c#,datetime,nullable,C#,Datetime,Nullable,我想使用DateTime.TryParse方法将字符串的DateTime值转换为可空值。但当我尝试这个: DateTime? d; bool success = DateTime.TryParse("some date text", out (DateTime)d); 编译器告诉我 “out”参数未归类为变量 不知道我需要在这里做什么。我也试过: out (DateTime)d.Value 这也不管用。有什么想法吗 DateTime? d=null; DateTime d2; bool s

我想使用DateTime.TryParse方法将字符串的DateTime值转换为可空值。但当我尝试这个:

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中:


您不能这样做,因为
Nullable
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;
}
public bool TryParse(字符串文本,输出可空数据)
{
日期时间日期;
bool isParsed=DateTime.TryParse(文本,过期);
如果(isParsed)
n数据=新的可空数据(日期);
其他的
nDate=新的可空();
返回已分配;
}
希望这有帮助:)

编辑: 删除了(显然)测试不正确的扩展方法,因为(正如一些坏的hoor所指出的)尝试更改“this”参数的扩展方法无法处理值类型


注:问题中的坏胡尔是一位老朋友:)

以下是杰森建议的略显简洁的版本:

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

我不明白微软为什么不处理这个问题。一个聪明的实用方法来处理这个问题(我有int的问题,但是用DateTime替换int也会有同样的效果,可能是

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

创建一个扩展方法怎么样

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;

    }
}

或者,如果您不关心可能引发的异常,您可以将TryParse更改为Parse:

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

虽然也不会有表示成功的布尔值,但在某些情况下,如果您知道输入文本总是有效的,那么它可能会很实用。

这就是您要查找的一行:

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

以下是一个单线解决方案:

DateTime?d=DateTime.TryParse(“text”,out-DateTime-parseDate)?parseDate:(DateTime?)null;


你说得对,我一直在寻找更多的一行程序来完成它,但我想这样就可以了。不喜欢创建临时变量,感觉很混乱。-/似乎应该更好地支持这种情况。请参阅Binary Worrier的建议,将它嵌入扩展方法。为什么要将DateTime强制转换为DateTime?你没有在将d2传递到TryParse之前需要对其进行重述。@Slace--我更新了答案以纳入您的建议。@Jason Kealey我希望这已经在VS2012中引入,否则我将不得不继续使用这段好代码。您不想初始化日期[因为您将其用作out参数]好的,我不再挑剔了!我身上没有编译器,但由于DateTime是一种值类型,扩展方法def compile吗?结果不会返回,除非您确定--[TestFixture]公共类在处理{[Test]public void TryParseShouldWork()时返回{DateTime?x=null;var res=Externders.TryParse(x,“1/1/1990”);Assert.IsTrue(res);Assert.That(x!=null);}在Assert上失败。也就是说,结果不会因为DateTime而被修改,这是一种值类型(在手机屏幕上总是一个很好的剔除问题:D)(obv是第一个)(不延期)一个可以工作,但它应该是out,而不是ref-如果它不能与TryXXX API相匹配,你应该将结果置零-很确定FDG提到了这一点。伙计,我很挑剔!第一个参数,
dateTime
,是干什么的?它从来没有被使用过。@mikez-扩展方法就是这样工作的,编译器使用它来知道它的应该是一个扩展方法。@MystereMan我知道扩展方法是什么。更合适的扩展方法签名应该是
DateTime?TryParse(这个字符串是dateString)
。这个实现太奇怪了。@mikez-那你为什么问它是干什么的?为什么只在datetime中使用字符串名称空间?目的是提供一个与datetime.TryParse(即datetime)的模拟?。TryParse@ErikFunkenbusch此扩展方法不允许像
(DateTime?).TryParse这样的调用语法(…)
Nullable.TryParse(…)
。所以mike z是对的,这是一个愚蠢的方法签名。我可能不应该与Skeet争论,但是…你应该调用你的方法Parse,因为我希望名为TryParse的方法遵循TryParse约定并返回布尔值。;-)@迈斯特:在这两种情况下,它都没有完全遵循现有的惯例——那些习惯于
Parse
的人会期望它返回
DateTime
,并在失败时抛出异常,对吗?但是,是的,你可以做任何你想做的事情……在野田佳彦,我将相关的方法命名为
Parse
yword是不必要的(在您的第一个示例中),因为永远无法到达
if
块的终点。@JeppeStigNielsen:是的,它是不必要的-但它可能在风格上更适合对称性。这只是个人偏好(我也不一致…)@Kiquenet:使用else可以更清楚地表明,将采用一条或另一条路径,并且两条路径都会返回。我反对大规模嵌套代码,但在这种情况下,我认为这真的不是问题。@robnick这与我所说的有什么不同?忽略我之前的评论(我对你的解决方案投了赞成票!),对于最新的C#我需要将null:DateTime?d=DateTime.TryParse(blah,out-DateTime dt)?dt:(DateTime?)转换为null;那么…你只是在4个月后复制了我的答案?
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;
    }
}