(A)我可以这样做......
var newRestaurant = new Restaurant();
newRestaurant.Cuisine = model.Cuisine;
newRestaurant.Name = model.Name;
(B)我可以这样写...
var newRestaurant = new Restaurant() { Name = model.Name };
(C)但是为什么我不能这样写呢......
var newRestaurant = new Restaurant() model;
(Q)(B)只是一个Object-Literal而(C)是一个对象实例吗?
很想知道。
THX
答案 0 :(得分:4)
不是(B)只是一个Object-Literal而(C)是一个对象实例吗?
简短的回答?不,C#不使用花括号来表示像JavaScript或类似语言那样的对象文字; C#使用花括号来引用块。
在代码中
var newRestaurant = new Restaurant() { Name = model.Name };
{ Name = model.Name }
部分不是对象文字,它是初始化块。您可以使用类似的语法来初始化列表和词典之类的集合:
var myString = "string3";
var myList = new List<string>() { "string1", "string2", myString };
var myDictionary = new Dictionary<string, int>()
{
{ "string1", 1 },
{ "string2", 2 },
{ myString, 3 },
};
正如您所看到的,这些块的语法根据它们之前的对象类型而有所不同。此代码由编译器转换为
var myString = "string3";
var myList = new List<string>();
myList.Add("string1");
myList.Add("string2");
myList.Add(myString);
var myDictionary = new Dictionary<string, int>();
myDictionary.Add("string1", 1);
myDictionary.Add("string2", 2);
myDictionary.Add(myString, 3);
就你的例子而言,它已转变为:
var newRestaurant = new Restaurant();
newRestaurant.Name = model.Name;
当您尝试使用model
之类的var newRestaurant = new Restaurant() model;
时,编译器不知道model
中的哪些属性或者您对它们的意图;你想加入一个清单吗?你想复制所有的属性吗?如果model
中的所有属性都不匹配,该怎么办?
C#的后续版本将有一个名为 Records 的东西,它将具有与您所描述的相似的功能(将字段从一个东西复制到另一个东西)。如果您有兴趣,可以阅读它们on the compiler's github page,但它非常技术性。