小编yww*_*325的帖子

为什么编译器会抛出错误 CS0165:使用未分配的局部变量?

我把代码放在下面,也上传到了一个在线的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# compiler-errors

7
推荐指数
1
解决办法
2821
查看次数

TypeScript 是否支持带有对象初始值设定项的构造函数?

例如,在 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”。不如使用对象初始值设定项语法快。有没有更好的办法?

typescript

5
推荐指数
1
解决办法
2737
查看次数

标签 统计

c# ×1

compiler-errors ×1

typescript ×1