【问题标题】:The generic type already contains a definition泛型类型已经包含一个定义
【发布时间】:2021-06-08 09:41:41
【问题描述】:

如果我尝试在 C# 中定义以下 Pair<A, B> 类,则会出现编译器错误。

public class Pair<A, B>
{
    public Pair(A a, B b)
    {
        this.A = a;
        this.B = b;
    }

    public A A { get; }
    public B B { get; }
}

编译错误是:

error CS0102: The type 'Pair<A, B>' already contains a definition for 'A'
error CS0102: The type 'Pair<A, B>' already contains a definition for 'B'

冲突的定义在哪里?

通常,可以定义一个与其类型同名的属性,例如:

public Guid Guid { get; }
public Uri Uri { get; }

为什么编译器会抱怨名称 AB

【问题讨论】:

  • 尽管问题来自泛型类型参数,而不是类型变量的命名冗余,但我推荐 C# Naming ConventionsC# Coding Standards and Naming ConventionsC# Coding Conventions (C# Programming Guide) 以及 Robert C. Martin 的书籍例如跨度>
  • “冲突的定义在哪里?” - 一个在类声明Pair&lt;A, B&gt; 中,一个用于属性。 (如果Guid 是在同一个类中声明的嵌套类型,则您的Guid 示例将被破坏,这更接近这里的情况。)
  • @MarkSeemann:可以,而且类型参数的名称不允许与类成员的名称相同。
  • @JonSkeet 哇,我从 2002 年开始才编写 C#,但我并不知道。谢谢你的回答。这在 C# 规范中吗?
  • @MarkSeemann:是的,我正在添加一个链接。

标签: c# generics compiler-errors


【解决方案1】:

它在 C# 标准的“类成员”部分中指定。在当前draft-v6 branch

类声明的type_parameter_list中类型参数的名称应与同一type_parameter_list中所有其他类型参数的名称不同,并且应与名称不同该类的名称和该类所有成员的名称。

换句话说,您不能获得与另一个类型参数或类成员同名的类型参数。在这里,您有一个名为 A 的类型参数和一个名为 A 的属性。

属性的类型也是A这一事实无关紧要;这段代码给出了同样的错误:

class Broken<T>
{
    public string T { get; set; }
}

【讨论】:

  • 哇,在那个例子中,错误信息也突然变得有意义了。 :D
猜你喜欢
  • 2013-06-16
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 2018-10-05
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多