【发布时间】:2019-11-28 23:19:39
【问题描述】:
考虑以下 C# 代码:
using System;
public static class C
{
public static int[] TryGetIntArray<T>(T[] x)
{
if (x is int[] arr) // ok
return arr;
return Array.Empty<int>();
}
public static Span<int> TryGetIntSpan<T>(Span<T> x)
{
if (x is Span<int> span) // An expression of type 'Span<T>' cannot be handled by a pattern of type 'Span<int>'.
return span;
return Span<int>.Empty;
}
}
如果参数在运行时实际上是该类型,则该想法是将参数作为Span<T>(在本例中为Span<int>)的特定特化返回;否则,只返回一个空跨度。
我们可以看到这种方法适用于数组,但会因 span 而失败。是否也有解决方法可以使用跨度执行此操作?
【问题讨论】:
-
而且它也适用于ArraySegment
,所以它不仅仅是一个值类型的问题。
标签: c# generics memory .net-core casting