今天,我遇到了与C#有关的问题。我必须编写一个程序,它将通过一些测试。我实现的所有功能均正常运行,但是有一项测试禁止使用公共字段,但测试失败。
我有一个实现IEnumerable的通用类,引起问题的是:
public IEnumerator<R> GetEnumerator()
{
foreach (R r in roomList)
yield return r;
}
如果我将此类归为“ return null”,则测试可以通过。我不知道有什么问题吗?这是一个测试报告:
Result Message: Assert.Fail failed. Detected type "Exercise.Hotel`2+<GetEnumerator>d__0" with public filed(s) "Exercise.Hotel`2[R,SC] <>4__this, R <r>5__1, Enumerator <>7__wrap2", which is not allowed.
这也是测试代码。老实说,我对它的工作方式不是很熟悉。当然,它也可能是由不良测试引起的。
var withPublicField = types.Where(t => !t.IsEnum)
.Where(t => t.GetFields(BindingFlags.Public | BindingFlags.Instance).Count() > 0)
.Where(t => !t.Name.StartsWith("<>c__DisplayClass"))
.ToDictionary(t => t.FullName, t => t.GetFields(BindingFlags.Public | BindingFlags.Instance));
感谢帮助。这是我的第一个问题,所以我希望我一切都很好:)
您正在谈论这是一个奇怪的测试。
迭代器方法(即其中包含方法的方法yield return
)触发失败的原因是C#编译器重写了此类方法,以返回将方法实现为状态机的隐藏类的实例。正是这种类型包含了不允许的公共字段。
就我个人而言,我认为失败是一种误报。我同意公共字段通常是可憎的,但是在这种情况下,您要处理的是隐藏的,由编译器生成的代码。这种特殊情况应该很好。
希望在这种情况下,您可以通过解释“这不是我的错!”来抑制失败。替代方法是实现自己的类,该类实现方案的IEnumerator<T>
类型,并且该类当然不包含公共字段。
编辑:我注意到在查看测试代码时,它已经尝试排除捕获变量(即Name.StartsWith("<>c__DisplayClass")
)的编译器生成代码。因此,也许测试作者会对编译器生成的<GetEnumerator>
类型添加类似的排除项(或者当然要[CompilerGenerated]
根据Lee的回答进行检查)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句