【问题标题】:'Lexical' scoping of type parameters in C#C# 中类型参数的“词法”范围
【发布时间】:2010-05-13 08:32:37
【问题描述】:

我有两个场景。

这失败了:

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

错误 CS0102:“F&lt;X&gt;”类型已包含“X”的定义

这行得通:

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

唯一合乎逻辑的解释是,在第二个 sn-p 中,类型参数 X 超出范围,这是不正确的......

为什么类型参数会影响我在类型中的定义?

IMO,为了保持一致性,要么两者都应该工作,要么都不应该工作。

还有其他想法吗?

PS:我称之为“词汇”,但它可能不是正确的术语。

更新:

根据 Henk 的回答,这是一个显示相同行为的非通用版本,但可能更容易理解。

失败:

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

作品:

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

据我所知,C# 编译器在类型定义边界处创建了一个词法范围。

这也意味着类型和成员名称位于相同的“位置”(或 LISP 中的 namespace)。

【问题讨论】:

  • 我不明白为什么第一个不应该工作,任何人都能够重现编译器错误?
  • 根据您的更新,看起来 Marcelo 回答了您的问题 - 他演示了同样的事情。
  • @Kobi:不,不完全是:) 我也没有对他投反对票,因为它是部分适用的。
  • 不相关,但你能看看我的问题 leppie 吗? stackoverflow.com/questions/4444708/…

标签: c# generics compiler-construction compiler-errors


【解决方案1】:

G 类引入了独特的命名范围。如果省略默认规则,则 2 个版本变为:

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

【讨论】:

  • 谢谢,这似乎有点道理 :) 为什么:class F { class X { } public X X { get;放; } } 也失败了。
【解决方案2】:

X 被定义为F 范围内的类型。类似这样:

class F
{
  public void X();

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

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

F.X 并未超出G 的范围,但这并不能阻止G 定义一个新的X

【讨论】:

  • 对不起,你的 X 是成员,我的是类型参数。我能理解。
  • 对不起,@leppie 很迟钝。你同意还是不同意我的观点?
猜你喜欢
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
相关资源
最近更新 更多