标签: collection-initializer

对象初始化类似于List <>语法

如何定义类以便可以类似地初始化类List<T>:

List<int> list = new List<int>(){ //this part };
Run Code Online (Sandbox Code Playgroud)

例如,这种情况:

Class aClass = new Class(){ new Student(), new Student()//... };
Run Code Online (Sandbox Code Playgroud)

c# collections collection-initializer

3
推荐指数
1
解决办法
203
查看次数

使用 C#12 集合表达式初始化 List&lt;List&gt;&gt; 的语法是什么?

假设我有这样的代码(或任何类型的锯齿状结构):

var intListList = new List<List<int>> {
    new() { 1, 2, 3 }
};
Run Code Online (Sandbox Code Playgroud)

我想在这里使用集合表达式。Resharper (EAP) 建议这样做:

var intListList = new List<List<int>> {
    [1, 2, 3]
};
Run Code Online (Sandbox Code Playgroud)

但这不能编译。

这一定是可能的!语法是什么?

编辑:

好的。因此,从答案中,不是这样,而是在表达式中声明类型:

// does not compile
var intListList = new List<List<int>> {
    [1, 2, 3]
};
Run Code Online (Sandbox Code Playgroud)

类型必须显式声明,并且没有new()

// compiles!
List<List<int>> intListList = [[1, 2, 3]];
Run Code Online (Sandbox Code Playgroud)

c# collection-initializer .net-8.0 c#-12.0

3
推荐指数
1
解决办法
614
查看次数

列表属性的空集合初始值设定项结果为null

当我运行此代码时,它不会ThisIsAList像我期望的那样初始化为空集合...而是ThisIsAList为null.

void Main()
{
    var thing = new Thing
    {
        ThisIsAList = {}
    };

    Console.WriteLine(thing.ThisIsAList == null); // prints "True"
}

public class Thing
{
    public List<string> ThisIsAList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

为什么这不是编译错误?为什么结果null


我想知道是否可能存在隐式转换,但以下尝试产生了编译错误:

thing.ThisIsAList = Enumerable.Empty<string>().ToArray();
List<int> integers = { 0, 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

根据关于集合初始化程序的 MSDN文档,它听起来像集合初始化程序基本上只是处理调用Add().所以我寻找可能的重载List.Add,但没有找到我认为适用的任何东西.

有人可以从C#规范解释这里发生了什么吗?

c# collection-initializer

2
推荐指数
1
解决办法
582
查看次数

双括号集合初始值设定项中的未定义构造函数错误

在以下代码中,该getEntriesNotWorking方法报告编译时错误:

public class DoubleBracketInitializerTest {

    class Container {}

    class Entry {
        Container container;
        public Entry(Container container) {
            this.container = container;
        }
    }

    class DetailedContainer extends Container {

        List<Entry> getEntriesNotWorking() {
            return new ArrayList<Entry>() {{
                add(new Entry(this)); // compile-time error mentioned below
            }};
        }

        List<Entry> getEntriesWorking() {
            return Arrays.asList(new Entry(this));
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

错误:

构造函数DoubleBracketInitializerTest.Entry(new ArrayList(){})未定义

虽然该getEntriesWorking()方法正确编译.构造函数显然在那里,因为它DetailedContailer是一个子类Contailer.

这两种方法有什么区别,使代码无效?如何使双括号初始化程序适用于此类层次结构?

java collections collection-initializer

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

为什么在对象初始值设定项内部允许使用不带“new”的集合初始值设定项,而在对象初始值设定项外部则不允许?

我在初始化集合属性时注意到奇怪的行为。

考虑:

class X
{
    public IList<int> Ints { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Ints我可以这样初始化:

var theObject = new X
{
    Ints = { 12, 3, 4, 5, 6 }
};
Run Code Online (Sandbox Code Playgroud)

但我不能这样做:

var x = new X();

x.Ints = { 12, 3, 4, 5, 6 }
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?这似乎很不直观。

c# object-initializers collection-initializer

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

System.Array不支持Add(),那么集合初始化程序如何工作?

在C#中,您可以像这样初始化一个数组:

var example = new int[] { 1, 4, 3 };
Run Code Online (Sandbox Code Playgroud)

正如Custom Collection Initializers中引用的那样:

应用集合初始值设定项的集合对象必须是实现System.Collections.IEnumerable的类型,否则会发生编译时错误.对于按顺序的每个指定元素,集合初始值设定项在目标对象上调用Add方法,并将元素初始值设定项的表达式列表作为参数列表,为每次调用应用正常的重载决策.因此,集合对象必须包含每个元素初始值设定项的适用Add方法.

但是你不能添加到System.Array,必须为每个添加的项创建一个新的更大的数组,这对性能不利.那么在数组上使用集合初始值设定项时C#如何工作?我想知道我是否可以用支持集合初始化程序的内部数组编写一个类.

c# arrays collection-initializer

0
推荐指数
1
解决办法
112
查看次数

初始化lambda表达式列表

我正在设计一个状态机类,并希望使用lambda表达式来表示满足状态转换对象的条件.当我创建一个新的状态转换对象时,我还想传递一个条件列表,它可以用来评估是否转移到下一个状态.但是,我在初始化条件列表时遇到了问题.这是一个示例,简化的代码示例,说明了我遇到的问题:

// Alias for delegate function
using Condition = Func<int, bool>;

class SomeStateClass
{
    public void SomeFuncToCreateConditionList()
    {
        List<Condition> conditions = new List<Condition>({
            { new Condition(x => x > 5) },
            { new Condition(x => x > 5 * x) }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到一个语法错误就行了柯利括号List<Condition>({说法) expected,并在右括号的另一种语法错误说

new Condition(
; expected
} expected
Run Code Online (Sandbox Code Playgroud)

我确信这里有一些愚蠢的东西,但我一直盯着它看似太久了,似乎无法发现它.任何想法?

c# lambda collection-initializer

0
推荐指数
1
解决办法
278
查看次数