1

我不明白为什么以下代码无法编译:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1 {
    public interface ITestCondition<T> {
    }

    public class TestConditionBase<T>: ITestCondition<T> {
    }

    public class TestCondition<T>: TestConditionBase<T> {
    }

    public static class TestConditionExtension {
        public static V Foo<V, T>(this V condition) where V: ITestCondition<T> {
            return condition;
        }
    }

    class Program {
        static void Main(string[] args) {
            new TestCondition<int>().Foo();
        }
    }
}

它说它找不到“foo”。但它在没有泛型类型的情况下完美运行。

4

3 回答 3

5

编译器无法推断类型。明确指定它们:

new TestCondition<int>().Foo<TestCondition<int>, int>();
于 2013-03-21T15:51:37.643 回答
4

可以推断出 V 但不能推断出 T,因此对 Foo 的调用必须失败。

为什么不能推断出 T?

在执行方法类型推断时,C# 从不从约束进行类型推断通过检查参数及其相应的形参类型之间的关系来进行推断。只有推理完成后,我们才会检查约束是否得到满足。

于 2013-03-21T16:32:54.543 回答
3

我认为您正在寻找它作为您的扩展方法:

public static class TestConditionExtension
{
    public static ITestCondition<T> Foo<T>(this ITestCondition<T> condition)
    {
        return condition;
    }
}

由于 V 始终是 ITestCondition,因此没有理由让它比这更通用。

当我考虑使用泛型参数时,我使用的一个快速经验法则是“它是什么类型是否重要”。在这种情况下,具体的类型 J 无关紧要,只有父类型才重要。所以不要使用泛型,只需使用父类型。希望这是有道理的。

于 2013-03-21T15:53:18.847 回答