无法推断出以下c#代码。
using System.Collections.Generic;
namespace Test
{
public class Program
{
public static void Main()
{
Pipeline<string[]> s = null;
// Compiles fine.
s.WithNewDelimiters<Pipeline<string[]>, string[], string>();
// Fails to compile.
s.WithNewDelimiters();
}
}
public class Pipeline<T> { }
public static class Extensions
{
public static void WithNewDelimiters<TPipeline, TEnumerable, TElement>
(this TPipeline pipeline)
where TPipeline : Pipeline<TEnumerable>
where TEnumerable : IEnumerable<TElement>
{
}
}
}
虽然这是一个通用扩展方法的原因并不重要,但我可以在Pipeline<T>
现在已经不在了,这是我的逻辑:我正在从左到右阅读,所以可能这不是C#编译器工作的算法方式。
TPipeline
。 TPipeline
是Pipeline<TEnumerable>
我们已经传递了Pipeline<string[]>
。这意味着TEnumerable == string[]
TEnumerable
。 TEnumerable
是IEnumerable<string>
TElement
不受约束,因此可以是任何内容,因此可以将其设置为string
。显然,这个逻辑要么是有缺陷的,要么是C#编译器的工作原理。我认为假设一个约束的值影响另一个约束我就错了。
但是我仍然不确定为什么这对C#编译器来说是模棱两可的。当然没有其他类型参数配置可以满足这些要求吗?