이것은 어떻게 C#사전에 초기화 정확합니까?

나는 우연히 다음과 나는'm 왜 그't 기 구문 오류가 있습니다.

var dict=new 사전<string,object> { ["Id"]=입니다.NewGuid(), ["부"]=new List<int>{4,5}, ["MyA"]=new 사전<string,object> { ["이름"]="솔로", ["점"]=88 } ["OtherAs"]=new List<사전<string,object>> { 새 사전<string,object> { ["점"]=1999 } } };

알","는 누락 사"MyA"고,"OtherAs".

이것은 혼란이 일어나:

  1. 코드를 컴파일.
  2. 최종 사전"dict"만 포함 세 가지 요소"Id","부"고,"MyA".
  3. 값을 위해 모든 제외"MyA"올바르
  4. "MyA"는 가치를 선언"OtherAs"하는 동안,그것의 원래 값은 무시됩니다.

왜't 이 불법? 이에 의해 디자인?

질문에 대한 의견 (9)
해결책

없는 쉼표로 모든 차이를 만든다. 그것이 원인이 인덱["OtherAs"]에 적용 될 이전

new Dictionary
{
    ["Name"] = "Solo",
    ["Points"] = 88
}

그래서 근본적으로 너'다시 말하기:

new Dictionary
{
    ["Name"] = "Solo",
    ["Points"] = 88
}["OtherAs"] = new List
{
    new Dictionary
    {
        ["Points"] = 1999
    }
};

이는 할당을 표현(x=y). 여기에는x은 사전"이름"와"점",색인을 가진"OtherAs"y목록<사전<string,object>>. 는 할당을 표현을 평가하는 값이 할당(y)는 목록의 사전.

의 결과는 이 전체적인 표현은 그 다음에 할당된 키"MyA"이유입니다,"MyA"는 목록의 사전.

는지 확인할 수 있습니다 이것은 무엇's 일어나 변경하여 이 유형의 사전x:

new Dictionary
{
    [1] = "Solo",
    [2] = 88
}
// compiler error saying "can't convert string to int"
// so indeed this indexer is applied to the previous dictionary
["OtherAs"] = new List
{
    new Dictionary
    {
        ["Points"] = 1999
    }
}

여기에는 코드,포맷하지만 일부는 괄호 안에 추가하는 방법을 보여 컴파일러가 구문 분석된다:

["MyA"] 
= 
(
    (
        new Dictionary
        {
            ["Name"] = "Solo",
            ["Points"] = 88
        }["OtherAs"] 
    )
    = 
    (
        new List
        {
            new Dictionary
            {
                ["Points"] = 1999
            }
        }
    )
)
해설 (2)

무엇's 여기에서 일어나고 있는 만들고 있는 사전 다음을 인덱싱니다. 의 결과 indexer/지정 표현은 그 반환되는 것은 점점에 할당으로`MyA 사용 슬롯에 있습니다.

이:

["MyA"] = new Dictionary 
{
   ["Name"] = "Solo",
   ["Points"] = "88" 
}
["OtherAs"] = new List
{
   new Dictionary
   {
       ["Points"] = 1999
   }
}

분할할 수 있습으로 다음이비-코드:

var temp = new Dictionary
{ 
   ["Name"] = "Solo", 
   ["Points"] = 88 
};
// indexed contains result of assignment
var indexed = temp["OtherAs"] = new List
{
   new Dictionary
   {
      ["Points"] = 1999
   }
};
// value is set to result of assignment from previous step
["MyA"] = indexed;
// temp is discarded

의 결과에 할당하는 인덱의 두 번째 사전이 반환됩(할당 값을 반환합당/오른쪽)는 사전 임시역는 단"으로 사라지 ether". 의 결과 indexer(의 목록 사전에)어떤 위치 주요 사전 끝에서.

이것은 이상한 사례로 만들어 떨어지기 쉽게 되어 있는 것으로 사용으로 인해의객체형식의 사전 값입니다.

해설 (0)