簡體   English   中英

C#中類型參數的“詞匯”作用域

[英]'Lexical' scoping of type parameters in C#

我有兩種情況。

這將失敗:

class F<X>
{
  public X X { get; set; }
}

錯誤CS0102:類型' F<X> '已經包含' X '的定義

這有效:

class F<X>
{
  class G
  {
    public X X { get; set; }
  }
}

唯一的邏輯解釋是在第二個代碼段中,類型參數X不在范圍內,這是不正確的...

為什么類型參數會影響我對類型的定義?

海事組織,為了保持一致,兩者都應該起作用,或者都不應該起作用。

還有其他想法嗎?

PS:我稱它為“詞匯”,但這可能不是正確的術語。

更新:

根據Henk的回答,這是一個顯示相同行為的非通用版本,但可能更容易理解。

失敗:

class F
{
  class X { }
  public X X { get; set; }
}

作品:

class X { }
class F
{
  public X X { get; set; }
}

據我所知,C#編譯器在類型定義邊界創建了一個詞法作用域。

它還暗示類型和成員名稱位於相同的“位置”(或按LISP namespace )。

G類引入了獨特的命名范圍。 如果省略默認規則,則兩個版本將變為:

public F<X>.X F<X>.X { get; set; }    // error
public F<X>.X F<X>.G.X { get; set; }  // OK

X被定義為F范圍內的類型。 與此類似:

class F
{
  public void X();

  public int X(); // Bad, trying to redefine X.

  class G
  {
    public string X(); // OK, different scope
  }
}

FX不在G的范圍之外,但這不會阻止G定義新的X

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM