我有2个场景。
这失败了:
class F<X>
{
public X X { get; set; }
}
错误CS0102:“F<X>
”类型已包含“X
”的定义
这有效:
class F<X>
{
class G
{
public X X { get; set; }
}
}
唯一合乎逻辑的解释是,在第二个片段中,类型参数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
)。
答案 0 :(得分:3)
G类引入了独特的命名范围。如果省略默认规则,则2个版本将变为:
public F<X>.X F<X>.X { get; set; } // error
public F<X>.X F<X>.G.X { get; set; } // OK
答案 1 :(得分: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
。