xUnit.net:为什么这两个等效测试有不同的结果?

时间:2016-03-19 17:22:54

标签: c# .net xunit xunit.net surrogate-pairs

出于某种原因,使用$('#filter_pic').prop('checked') 的此测试在xUnit中失败:

InlineData

虽然这使用[Theory] [InlineData("\uD800", 1)] public static void HasLength(string s, int length) { Assert.Equal(length, s.Length); } ,但却通过了:

MemberData

这是什么原因?我在xUnit.net中发现了一个错误吗? (我认为这可能与public static IEnumerable<object[]> HasLength_TestData() { yield return new object[] { "\uD800", 1 }; } [Theory] [MemberData(nameof(HasLength_TestData))] public static void HasLength(string s, int length) { Assert.Equal(length, s.Length); } surrogate character的事实有关,并且在通过\uD800时以某种方式被翻译为2个字符。不知道为什么但是。)

2 个答案:

答案 0 :(得分:1)

不,这不是一个错误。

如果要在UTF-16中表示大于U + FFFF的值,则需要使用两个UTF-16代码单元:高代理(在0xD800到0xDBFF范围内),然后是低代理(在范围0xDC00到0xDFFF)。所以一个高代理人本身就没有意义。它本身就是一个有效的UTF-16代码单元,但只有在低代理项后才有意义。

本文http://codeblog.jonskeet.uk/2014/11/07/when-is-a-string-not-a-string/

中的更多信息

答案 1 :(得分:1)

Nicolay的回答并没有回答这个问题,而是link对它的回答:

使用UTF-8存储属性值,并且无法从UTF-16成功转换隔离的高代理值。

这是确认情况的(VB.NET)LinqPad query