2017-02-09 126 views
-2

这个问题可能有些挑剔,但我真的需要明白这一点。编译器错误CS0201

我有以下代码:

string.Equals("0", "1"); //returns false, does compile 

int i = 1; 
i == 0; //should return false, does not compile 

第二部分抛出异常

只有分配,调用,递增,递减和新的对象表达可作为声明使用

documented,至少一个分配(=),方法调用()new--++操作必须被调用。

问题:这是不是意味着==不是一种方法?

+0

您不能将比较'i == 0;'作为单个语句。如果您试图将变量声明为if块的唯一语句,例如'if(true){int i = 0}' –

+0

==确​​实不是一种方法,它是一个运算符 – nbokmans

+0

'=='是*运算符*。它可以通过自定义类型的方法来支持*,但编译器可以在知道涉及的类型时自由地编译专用代码。 –

回答

1

正确。 ==不是一种方法。这是一个运营商。而比较运算符本身没有观察比较结果,这是没有意义的。

可以做到这一点:

i.Equals(0); 

因为.Equals()是一个方法调用,并为您string.Equals()证明,你可以通过调用自身线路上的方法(即使你忽略的结果方法)。


编辑:要澄清的东西你已经编辑成问题:

i == 0; //should return false 

操作员没有“回报”的结果,但它确实评估为结果。 (尽管支持/重载操作符的自定义方法,但该方法在框架下被用于评估结果。)但是,操作符只能用于语言允许的上下文中。在比较运算符的情况下,编译器不允许它自己作为语句存在。 (没有必要允许它,所以语言/编译器等团队无需支持它。)

+0

好吧忘了那:) – Toshi