高级类型推断

时间:2015-01-09 20:50:21

标签: c# generics

我希望编译器为我推断出一种类型,但我不确定它是否可行,或者最佳替代方案可能是什么。

我想这样做:

public static TValue Get<TValue>(TKey key) where TValue : Mapped<TKey> { ... }

public class MyObject : Mapped<int> { ... }

让C#推断TKeyint。有没有办法做这样的事情?如果没有,最好的替代方案是什么?

我想避免做Get<MyObject, int>(1);

之类的事情

修改

对于将来发现此问题的任何人,我们都会提出类似的问题herehere

2 个答案:

答案 0 :(得分:7)

不,在C#中无法做到这一点。您基本上要求的是能够明确指定一些通用参数并推断其余参数。 C#不支持这种情况;需要对所有通用参数进行泛型类型推断。

答案 1 :(得分:3)

@Servy是正确的,但正如在其他线程中已经指出的那样,有时你可以拆分类型以使事情可以推断。

在这个例子中,我们在类声明中指定了不可推断的类型,在方法声明中指定了可推断的类型。

public static class InferHelper<TValue>
    where TValue : class
{
    public static TValue Get<TKey>(TKey key)
    {
        // do your magic here and return a value based on your key
        return default(TValue);
    }
}

你这样称呼它:

var result = InferHelper<MyObject>.Get(2);