Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编译但引发异常的集合初始值设定项_C# - Fatal编程技术网

C# 编译但引发异常的集合初始值设定项

C# 编译但引发异常的集合初始值设定项,c#,C#,我在声明集合初始值设定项时速度有点快,最终得到了一些可编译的东西,但在运行时失败了。我的问题是我写了什么,为什么要编译?此测试再现了以下问题: [TestFixture] public class ExploratoryTests { [Test, Ignore] public void Test() { try { var test = new TestClass {

我在声明集合初始值设定项时速度有点快,最终得到了一些可编译的东西,但在运行时失败了。我的问题是我写了什么,为什么要编译?此测试再现了以下问题:

[TestFixture]
public class ExploratoryTests
{
    [Test, Ignore]
    public void Test()
    {
        try
        {
            var test = new TestClass
            {
                ListOfStrings = { "hello", "world", "!" }
            };
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
    public class TestClass
    {
        public List<string> ListOfStrings { get; set; }
    }      
}
[TestFixture]
公共类探索者测试
{
[测试,忽略]
公开无效测试()
{
尝试
{
var test=新的TestClass
{
ListOfstring={“你好”、“世界”、“!”}
};
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
}
公共类TestClass
{
公共列表列表字符串{get;set;}
}      
}
这将打印错误:对象引用未设置为对象的实例。 我的意思是用
新列表{“hello”,“world”,“!”}
初始化listofstring。这当然行

我尝试过搜索,但我不知道这个结构叫什么。我找了一些C#book,但运气不好。我寻求的帮助是这个构造的名称和一个指向它应该用于什么以及为什么编译的说明的指针


提前感谢!:)

此处的代码:

var test = new TestClass
{
    ListOfStrings = { "hello", "world", "!" }
};
相当于:

var test = new TestClass();
test.ListOfStrings.Add("hello");
test.ListOfStrings.Add("world");
test.ListOfStrings.Add("!");
但是
listofstring
null

如果您的类是这样定义的,则不会出现任何错误:

public class TestClass
{
    public List<string> ListOfStrings { get; set; }
    public TestClass()
    {
        ListOfStrings = new List<string>();
    }
}      
公共类TestClass
{
公共列表列表字符串{get;set;}
公共测试类()
{
ListOfStrings=新列表();
}
}      

在封面后面,您的属性列表ListOfStrings指的是指向某个内存的指针。当您不使用new关键字初始化时,指针要么包含无效值,要么指向尚未分配的内存(这就是错误消息试图告诉您的)。它会编译,因为在您运行程序之前,它实际上不会尝试写入该内存位置。@Duston,“指针”,etc.是完全错误的词汇,因为我们谈论的是托管语言。您当然是正确的,但您能否提供原因(规范方面)说明
newtestclass{listofstring={“hello”,“world”,“!”}
newtestclass{listofstring=newlist{“hello”,“world”,“!”}不同
?对象初始值设定项只需按照上述示例分配属性(第二段代码)。如果不创建
新列表
ListOfStrings
引用为空-您不能对空引用调用方法。别忘了对象初始值设定项只是一堆语法糖operations@Charleh,他们都是“对象初始值设定者”。是的,我没有说任何相反的话(我提到的是答案中的代码)。检查此处:了解详细信息-特别是“集合初始值设定项”位