C# 写“什么?”&引用;如果属性为null,则在字符串中

C# 写“什么?”&引用;如果属性为null,则在字符串中,c#,datetime,string-formatting,tostring,C#,Datetime,String Formatting,Tostring,我如何像“?”这样写Startdate?Startdate为空 public DateTime? StartDate { get; set; } public override string ToString() { return String.Format("Course {0} ({1} is an {2} course, will be given by {3}, starts on {4}, costs {5:0.00} and will have maximum {6} pa

我如何像“?”这样写Startdate?Startdate为空

public DateTime? StartDate { get; set; }

public override string ToString()
{
    return String.Format("Course {0} ({1} is an {2} course, will be given by {3}, starts on {4}, costs {5:0.00} and will have maximum {6} participants"
        , Name
        , CourseId
        , CourseType
        , Teacher
        , (StartDate == null ? "?" : StartDate)
        , Price
        , MaximumParticipants);
}
机器的两侧必须是同一类型。从文件中:

第一个_表达式和第二个_表达式的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换

因此,您可以简单地将日期转换为字符串(请注意,格式由您决定):


您可以调整现有代码

(StartDate == null ? "?" : StartDate.ToString())
或者利用
Nullable
.HasValue

(StartDate.HasValue ? StartDate.ToString() : "?")
关键是,
?:
要求两种条件的类型相同。

C#6允许您在不使用三元运算符的情况下编写此代码,如下所示:

StartDate?.ToString("dd-MM-yyyy") ?? "?"    
return $"Course {Name} ({CourseId} is an {CourseType} course, will be given by {Teacher}, starts on {StartDate?.ToString("dd-MM-yyyy") ?? "?"}, costs {Price:0.00} and will have maximum {MaximumParticipants} participants";
?。
只有在
StartDate
不是
null
时才会有条件地执行
ToString
。空合并运算符
将通过提供
“?”
字符串作为
Null
值的替换来完成作业

您可以进一步使用插值字符串替换
String.Format
,如下所示:

StartDate?.ToString("dd-MM-yyyy") ?? "?"    
return $"Course {Name} ({CourseId} is an {CourseType} course, will be given by {Teacher}, starts on {StartDate?.ToString("dd-MM-yyyy") ?? "?"}, costs {Price:0.00} and will have maximum {MaximumParticipants} participants";
您可以使用IsNullOrEmpty()函数,它将覆盖null或空日期
(IsNullOrEmpty(StartDate)?“?”:StartDate.ToString(“dd-MM-yyyy”)

将其更改为
(StartDate==null?”?“:StartDate.ToString())
三元语句要求两个操作数的类型相同。我明白了,因为StartDate是日期时间,而“?”是字符串
StartDate.ToString(“dd-MM-yyyy”)
将不起作用。我需要是:
StartDate.Value.ToString(“dd-MM-yyyy”)
。但是为什么需要额外的格式呢?@MartinMulder实际上可以。作为一个例子,我放在那里的格式,由OP来选择如何显示它。因为您的返回类型是String,并且您正在您的返回语句中构建一个,所以ternery运算符的true和false值也应该都是String@KoenVanLooveren没错。我将编辑以添加澄清。