使用以下代码,都会导致编译错误(.net 2):
var headers = new WebHeaderCollection();
var a = headers[0];
var b = headers[(int)0];
const int FIRST_HEADER = 0;
var c = headers[FIRST_HEADER];
全部失败:以下方法或属性之间的调用不明确:'System.Net.WebHeaderCollection.this [System.Net.HttpRequestHeader]'和'System.Net.WebHeaderCollection.this [System.Net.HttpResponseHeader] ”。
我可以在某种程度上理解为什么(a)会失败,因为重载接受HttpRequestHeader / HttpResponseHeader枚举;但是(b)和(c)被隐式地转换为int类型。
以下作品:
var headers = new WebHeaderCollection();
int index = 0;
var d = headers[index];
我在编写一些测试时遇到过这种情况,并且需要能够证明添加了预期的标题(在我的场景中总是唯一的!)
为什么我必须声明int类型的变量才能使用此重载?
答案 0 :(得分:1)
在所有情况下,表达式被视为“值为零的常量表达式” - 可隐式转换为任何枚举类型。
您之后的代码有效,因为您实际上已经失去了常量,因此会删除隐式转换。
事实上,C#编译器中存在一个错误,这意味着它将任何常量表达式视为零值,而不仅仅是整数值,因为它可以转换为任何枚举类型 - 所以这也适用,但不应该:
HttpRequestHeader weird = 0.0;