【问题标题】:Confuse about String Interpolation in C# 6.0 [duplicate]对 C# 6.0 中的字符串插值感到困惑 [重复]
【发布时间】:2018-01-23 03:15:34
【问题描述】:

我有这段代码,这个内联变量{ (hour > 12 ? "PM" : "AM") }

我创建它并且它可以工作但我很困惑,因为没有大括号() 我有一些代码有很多红色下划线的问题,感染编译器代码建议用红色下划线重构它,但是在用() 包装我的表达式之后它有效。

我只想知道() 在这个插值内联变量中的状态是什么?

WriteLine($"{hour}:{minout}:{seconds} { (hour > 12 ? "PM" : "AM") }");

【问题讨论】:

  • 只是为了确保您提供了一个示例,但不要真的以这种方式使用此代码 - dateTime.ToString("HH:mm:ss tt") 是这样做的正确方法。附: 12:00 是下午 12 点,而不是上午 12 点。
  • 感谢您的回复。但我只是为了演示目的而创建它。只是为了学习一些 C# 6 和 c# 7 的特性。谢谢,我会在我的项目中使用您的建议。谢谢

标签: c# c#-6.0


【解决方案1】:

: 运算符是用于字符串插值的字符串格式化的有效运算符

var date = new DateTime(2017, 8, 31);
var stringDate = $"Date is {date:yyyy.MM.dd}"; // "Date is 2017.08.31"

不带括号的: 被认为是格式字符串,而不是条件运算符,因此对于使用条件运算符,您应该将条件表达式用括号括起来。

var stringDate = $"It is {(date.Hours > 12 ? "evening" : "morning")}";

另一种方法(可能更具可读性)在格式化结果之前执行所有表达式

var dayPart = date.Hours > 12 ? "evening" : "morning";
var stringDate = $"It is {dayPart}";

【讨论】:

  • 我一直不明白他们为什么允许在那里表达。我的意思是如果你以后需要它,你需要复制粘贴你的代码。虽然使用计算变量(如在您的第二种方法中)使其至少可重用,而且它更具可读性。
【解决方案2】:

那里的括号表示一个表达式,首先需要对其求值,然后其结果将是插值字符串的输入。

对于正式的方法,请查看以下链接

Expressions 并搜索词带括号的表达式 在本文档中。

关于内插字符串,您可以找到更多信息here。但是,您必须记住的一件事是它的结构:

$"<text> {<interpolated-expression> [,<field-width>] [<:format-string>] } <text> ..."

在您的情况下,(...) 是插值表达式。

【讨论】:

  • 感谢您的回复。但是为什么代码建议没有以正确的方式重构。
  • @BabarQB 欢迎您。就我对重构建议的了解而言,我可以说编译器无法建议您重构代码的所有可能方式。当然,它可以发现许多常见的模式,然后给你一个建议。但是,还有许多其他模式,您不会从任何编译器/或任何静态分析工具中获得重构建议。
猜你喜欢
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 2021-12-05
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
相关资源
最近更新 更多