2010-08-03 31 views
5

我最近开始学习C#。我刚刚了解到属性,并决定制作一个简单的程序,以便更多地了解它们。 这是我写的代码:使用属性时出现C#歧义错误

class Dog 
{ 
    private int weight; 
    private string colour; 
    public string colour { get; set; } 
    public Dog(int theWeight, string theColour) 
    { 
     weight = theWeight; 
     colour = theColour; 
    } 
} 

,我得到一个含糊不清的错误。 据我了解,这不应该发生。

+0

当您对属性Color使用大写'C'时会发生什么?使用这种方法的 – 2010-08-03 07:42:35

回答

11

你有一个字段和一个同名的房产colour。这就是编译器产生错误的原因。

5

你不能同时拥有一个字段和一个属性。

您需要重命名两个colour标识符中的一个。

6

歧义错误是您命名字段和属性相同的名称“颜色”。 更改属性定义f.e.

public string Colour 
{ 
get { return colour;} 
set { colour = value;} 
} 
4

在行

colour = theColour; 

编译器不能告诉你是什么意思。它可以是

private string colour; 

,也可能是

public string colour { get; set } 

要消除歧义选择不同的命名约定帮助。例如,您可以选择属性具有大写首字母,字段以下划线和小写字母开头。在这种情况下,你的类将如下所示:

class Dog 
{ 
    private int _weight; 
    private string _colour; 
    public string Colour { get; set; } 
    public Dog(int theWeight, string theColour) 
    { 
     _weight = theWeight; 
     _colour = theColour; 
    } 
} 

注意,虽然,你可能有一个重复,这里反正。有可能是你并不打算将自动属性Color和字段_colour放在首位。

您也可以选择一个工具来帮助您遵循建议的指导原则。作为一个例子,看看FxCop。没有对错,但通过公认的规则工作肯定更容易。 (无可否认,我在字段中使用下划线的建议不符合通常所接受的内容,但我不使用公共字段。)

+0

将以2种不同的颜色属性/变量结束。可能用户只需要一个(删除_colour) – RvdK 2010-08-03 08:21:57

+0

是的。这就是为什么我在我的回答中提到:“但请注意,无论如何,您可能在这里有重复,很可能您并不打算将自动属性Color和字段_colour放在首位。” – Manfred 2010-08-03 08:43:33

1

请注意,在您的示例中,如果您使用的是C#3.0或更高版本,你并不真的需要那些私人领域,并可以使用自动实现的属性:

更多关于它的细节在这里... http://msdn.microsoft.com/en-us/library/bb384054.aspx

这将避免混乱的问题,无论是通过编程器和编译器,并提高可读性。