我有一个消息框显示一些文本和数据(如果存在)在数据库中。当前问题正在尝试显示null并尝试转换为ShortDate。我采取了两种方法,但没有一种能达到我的目的。
第一种方法在字符串中使用三元连接,但它的行为非常奇怪。
DialogResult DuplicateMessage = MessageBox.Show("A contact name " + DuplicateName.Forename + " " + DuplicateName.Surname + " already exists within the System."
+ "n Existing Client: " + DuplicateName.Forename + " " + DuplicateName.Surname
+ "n Date of Birth: " + DuplicateName.DOB != null ? Convert.ToDateTime(DuplicateName.DOB).ToString("yyyy-mm-dd") : " ",
,"Possible Duplicate Client", MessageBoxButtons.YesNo);
current消息框只显示换行符和出生日期。甚至连"出生日期"这句话都没有
如果我去掉三级和转换,只剩下
DialogResult DuplicateMessage = MessageBox.Show("A contact name " + DuplicateName.Forename + " " + DuplicateName.Surname + " already exists within the System."
+ "n Existing Client: " + DuplicateName.Forename + " " + DuplicateName.Surname
+ "n Date of Birth: " + DuplicateName.DOB
,"Possible Duplicate Client", MessageBoxButtons.YesNo);
这工作,显示一切。唯一的问题是出生日期的格式不对。我想知道如何使它的日期是短日期格式,并将显示一切。
'DuplicateName'的所有属性都是空的,
我怀疑这是使用条件运算符的运算符优先级的问题。它可能包括字符串连接作为被测试条件的一部分,而不是作为结果的一部分。可以显式地将该操作符的元素用圆括号括起来,以标识哪些字符串属于其中,哪些不属于其中:
"n Date of Birth: " + (DuplicateName.DOB != null ? Convert.ToDateTime(DuplicateName.DOB).ToString("yyyy-mm-dd") : " ")
另外,如果DOB
是DateTime?
,那么你可以简化你的代码:
"n Date of Birth: " + (DuplicateName.DOB.HasValue ? DuplicateName.DOB.Value.ToString("yyyy-mm-dd") : " ")
没有必要在Nullable<T>
类型上使用Convert
,您可以更容易(和安全)地使用HasValue
和Value
属性。
您可以使用另一对括号来修复它:
(DuplicateName.DOB != null ? Convert.ToDateTime(DuplicateName.DOB))
在第一种情况下,您将一个大字符串连接在一起(因为您没有使用任何括号),然后对null
进行测试。它相当于这个:
var stringToTest = "A contact name " + DuplicateName.Forename + " " + DuplicateName.Surname + " already exists within the System."
+ "n Existing Client: " + DuplicateName.Forename + " " + DuplicateName.Surname
+ "n Date of Birth: " + DuplicateName.DOB;
DialogResult DuplicateMessage =
MessageBox.Show(stringToTest != null ? Convert.ToDateTime(DuplicateName.DOB).ToString("yyyy-mm-dd") : " ",
,"Possible Duplicate Client", MessageBoxButtons.YesNo);