如何定义类以便可以类似地初始化类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) 假设我有这样的代码(或任何类型的锯齿状结构):
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) 当我运行此代码时,它不会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#规范解释这里发生了什么吗?
在以下代码中,该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.
这两种方法有什么区别,使代码无效?如何使双括号初始化程序适用于此类层次结构?
我在初始化集合属性时注意到奇怪的行为。
考虑:
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#中,您可以像这样初始化一个数组:
var example = new int[] { 1, 4, 3 };
Run Code Online (Sandbox Code Playgroud)
正如Custom Collection Initializers中引用的那样:
应用集合初始值设定项的集合对象必须是实现System.Collections.IEnumerable的类型,否则会发生编译时错误.对于按顺序的每个指定元素,集合初始值设定项在目标对象上调用Add方法,并将元素初始值设定项的表达式列表作为参数列表,为每次调用应用正常的重载决策.因此,集合对象必须包含每个元素初始值设定项的适用Add方法.
但是你不能添加到System.Array,必须为每个添加的项创建一个新的更大的数组,这对性能不利.那么在数组上使用集合初始值设定项时C#如何工作?我想知道我是否可以用支持集合初始化程序的内部数组编写一个类.
我正在设计一个状态机类,并希望使用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)
我确信这里有一些愚蠢的东西,但我一直盯着它看似太久了,似乎无法发现它.任何想法?