【问题标题】:Compiler giving "already contains a definition for error" in custom class [duplicate]编译器在自定义类中给出“已经包含错误定义”[重复]
【发布时间】:2019-07-14 21:31:09
【问题描述】:

当创建一个新的自定义类时,我试图像往常一样设置属性,但这个设置导致编译器给我错误

public class Card
{
    public string name { get; set; }
    public string set { get; set; }
    public string set_name { get; set; }
}

这最终给了我错误

“卡片”类型已经包含“set_name”的定义

好像不是保留字什么的。

我确信这很明显我错过了,任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 看看编译器生成的IL
  • 另外,可读性提示:如果我要阅读set_name,我会假设这是一种设置名称的方法;但在您的代码中,它是一个属性。可能会让人感到困惑......

标签: c#


【解决方案1】:

C# 属性实际上被编译为方法 - 所以name 属性实际上被编译为两个方法:set_name(string value)string get_name()

来自c# language specification

属性是字段的自然扩展。两者都是具有关联类型的命名成员,访问字段和属性的语法相同。但是,与字段不同,属性不表示存储位置。相反,属性具有指定在读取或写入其值时要执行的语句的访问器。
....
get 访问器对应于具有属性类型的返回值的无参数方法。除了作为赋值的目标外,当在表达式中引用属性时,会调用该属性的 get 访问器来计算该属性的值。

set 访问器对应于具有单个名为 value 的参数且没有返回类型的方法。

另外,你应该关注naming Conventions

X 请勿使用下划线、连字符或任何其他非字母数字字符。
X 避免使用与广泛使用的编程语言的关键字冲突的标识符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    相关资源
    最近更新 更多