lep*_*pie 8 c# compiler-construction generics compiler-errors
我有2个场景.
这失败了:
class F<X>
{
public X X { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
错误CS0102:类型" F<X>"已经包含了一个定义," X"
这有效:
class F<X>
{
class G
{
public X X { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
唯一合乎逻辑的解释是,在第二个片段中,类型参数X超出范围,这不是真的......
为什么类型参数会影响我在类型中的定义?
IMO,为了保持一致性,要么两者都应该有效,要么两者都不应该起
还有其他想法吗?
PS:我把它称为"词汇",但它可能不是正确的术语.
更新:
根据Henk的回答,这是一个显示相同行为的非通用版本,但可能更容易理解.
失败:
class F
{
class X { }
public X X { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
作品:
class X { }
class F
{
public X X { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
从我所看到的,C#编译器在类型定义边界创建一个词法范围.
它还意味着类型和成员名称位于相同的"位置"(或namespaceLISP).
G 类引入了独特的命名范围。如果省略默认规则,这两个版本将变为:
public F<X>.X F<X>.X { get; set; } // error
public F<X>.X F<X>.G.X { get; set; } // OK
Run Code Online (Sandbox Code Playgroud)