【发布时间】:2013-01-15 20:16:18
【问题描述】:
我对@987654323@ 中的foreach 行为有疑问。
我的自定义类实现了自定义GetEnumerator。此方法返回另一个object,它可以隐式转换为string。
但是,如果我执行foreach(string s in customClass),它会在运行时失败(“无法将 .. 类型的对象转换为字符串”)。
但是,如果我这样做 string x = new B(),它就像一个魅力。
注意:我在这里没有什么特别需要实现的,我只是想了解发生了什么。我对这种非-泛型行为特别感兴趣。
有什么想法吗?我缺少哪些基础知识?
复制此代码的代码:
public class A : IEnumerable
{
#region IEnumerable Members
public IEnumerator GetEnumerator()
{
yield return new B();
}
#endregion
}
public class B
{
public static implicit operator string( B b )
{
return "to-stringed implicit";
}
}
// CODE:
A a = new A();
// Works.
B b = new B();
string xxx = b;
// Doesnt work.
foreach( string str in a )
{
}
【问题讨论】:
-
你的隐式运算符 on
B是地狱之门;) -
“foreach 语句”部分(C# 5.0 规范的 8.8.4) - 它准确涵盖了在 foreach 中执行和未执行的内容(以及它转换为的代码)。该文档通常位于您的“Program Files (x86)\Microsoft Visual Studio XX.0\VC#\Specifications\YYYY”文件夹中。
-
@TimSchmelter 我已经说得很清楚了,这段代码与实际使用无关。我只是想知道,为什么在 foreach 中不调用隐式/显式转换。也许有人可以让我知道如何更清楚地写问题,以便人们不再指出这些事情。
标签: c# foreach ienumerable