2

由于某种原因,此测试InlineData在 xUnit 中使用失败:

[Theory]
[InlineData("\uD800", 1)]
public static void HasLength(string s, int length)
{
    Assert.Equal(length, s.Length);
}

而使用MemberData的 this 通过:

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);
}

这是什么原因?我在 xUnit.net 中发现了一个错误吗?(我认为这可能与它\uD800是一个代理字符这一事实有关,并且在通过时它以某种方式被翻译成 2 个字符InlineData。但不知道为什么。)

4

2 回答 2

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/

于 2016-03-19T18:54:21.837 回答
1

尼古拉的回答没有回答这个问题,但确实链接到它:

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

这是确认情况的(VB.NET)LinqPad 查询。

于 2016-03-20T12:02:29.543 回答