类型'Span <char>'不能用作类型参数

时间:2018-09-24 18:04:45

标签: c# .net-core

我试图声明这样的跨度列表:

public List<Span<char>> spanList;

但是由于错误消息类型'Span'可能不能用作类型参数,所以我似乎无法做到这一点。

那么,我在做什么错?谢谢。

2 个答案:

答案 0 :(得分:4)

  

我试图声明这样的跨度列表:

public List<Span<char>> spanList;

那是不合法的。

  

但是我似乎无法执行此操作,因为错误显示类型'Span'不能用作类型参数。

正确。跨度不能用作类型参数。

  

我在做什么错了?

您正在使用span作为类型参数。那不合法这就是为什么错误消息指出span不能用作类型参数的原因。

由于您已经知道这一点,所以不清楚您为什么提出这个问题。你到底在问什么?

跨度是非常特殊的类型,用于非常特定的目的。如果您尝试将跨度放入列表中,则说明您做错了非常多的事情,因为您正在直接违反跨度的预期目的。跨度的存在可以在某些非常有限的情况下为您提供更好的性能,而为获得更好的性能而付出的代价是对跨度使用方式的限制

这听起来很像我们所说的“ XY”问题。您有问题,对解决问题有疯狂的想法,疯狂的想法行不通,现在您是在问有关疯狂想法的问题,而不是真正的问题。问一个关于实际问题的问题。

  

还有其他选择吗?

既可以列出范围以外的内容,也可以使用列表以外的内容来管理范围。

由于我们不知道您要解决的问题,因此无法帮助您解决问题。我们不知道您要解决的问题是因为您没有不要说您要解决什么问题。帮助我们帮助您。

到目前为止,我们所知道的是您试图做非法的事情,然后询问有关错误消息的问题,该错误消息清楚地表明您正在做的事情是非法的。

答案 1 :(得分:3)

您也可以创建List<Memory<char>>。然后,您可以为各个元素获取一个Span<char>

var someCharArray = "abcdefghij".ToCharArray();

Memory<char> memory1 = someCharArray;
var memory2 = memory1.Slice(1, 3);

var list = new List<Memory<char>> { memory1, memory2 };

// ...

var span1 = list[0].Span;
var span2 = list[1].Span;

但是,我们真的需要知道您的用例,才能判断出这一切对您是否有用。

顺便说一句,我推荐this article on the topic。仔细阅读后,您可以确定上面的代码在您的用例中是否有意义。