我把代码放在下面,也上传到了一个在线的c#编译器: jdoodle.com/a/1jww 代码可以在线编译和运行,但是在我本地的visual studio中无法编译。
我在用:
Visual Studio 2017 15.9.13,
控制台应用程序,.Net Framework 4.7.2
语言版本 c# 7.3
Microsoft (R) Visual C# 编译器版本 2.10.0.0 (b9fb1610)
下面是代码:
class Program
{
static void Main()
{
Dictionary<string,int> myDict = new Dictionary<string,int>();
myDict.Add("hello", 1);
if (myDict?.TryGetValue("hello", out var value) == true)
{
Console.WriteLine("Hello" + value.ToString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
期望在 Console.Output 中看到 Hello1 因为如果条件为真,Null-Conditional 检查必须返回一个非空值,并且键存在于字典中并且从 TryGetValue 方法返回时必须已经分配了该值.
因为根据文档:
被调用的方法需要在方法返回之前分配一个值。
更新:这是https://github.com/dotnet/roslyn/issues/32572 中的一个悬而未决的问题,
如果对编译器的要求包括不发出误报,我认为这是一个真正的问题/错误。我的论点:
每当 CPU 执行到 if 括号代码块内的点时,该值必须从 TryGetValue 调用返回并且不是“未分配的局部变量”。如果编译器在解释空条件运算符时无法期待赋值状态,则更简单的解决方案是将诸如“无法确定赋值状态”之类的内容作为警告而不是错误。
例如,在 C# 中,我们有以下代码片段:
class OrderLine
{
public OrderLine(){
OrderId ="1",
ItemTitle ="2"
Console.WriteLine("constructing");
}
public string Platform { get; set; }
public string OrderId { get; set; }
public string ItemTitle { get; set; }
}
public static void Main()
{
var ol = new OrderLine
{
Platform ="p"
};
Console.WriteLine(ol.Platform);
}
Run Code Online (Sandbox Code Playgroud)
在 Typescript 中,如果我使用 {} 来初始化对象,我将无法调用可以给我一些默认值并执行其他操作的构造函数。如果我使用 new 关键字进行一些默认构造,我的编译器不允许我使用对象初始值设定项(我使用的是 Angular 6),并且我必须调用 ol.Platform 来分配属性值。当我有几个属性要设置值时,写多个“ol”。不如使用对象初始值设定项语法快。有没有更好的办法?