无法推断出类型参数:为什么?

时间:2017-07-04 08:38:54

标签: c# generics type-inference

无法推断出以下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>

的任何实例上链接这样的With-ers

现在已经不在了,这是我的逻辑:我正在从左到右阅读,所以可能这不是C#编译器工作的算法方式。

  • 首先,看看TPipelineTPipelinePipeline<TEnumerable>我们已经传递了Pipeline<string[]>。这意味着TEnumerable == string[]
  • 接下来,请看TEnumerableTEnumerableIEnumerable<string>
  • 由于TElement不受约束,因此可以是任何内容,因此可以将其设置为string

显然,这个逻辑要么是有缺陷的,要么是C#编译器的工作原理。我认为假设一个约束的值影响另一个约束我就错了。

但是我仍然不确定为什么这对C#编译器来说是模棱两可的。当然没有其他类型参数配置可以满足这些要求吗?

0 个答案:

没有答案