高级类型推理

本文关键字:推理 类型 高级 | 更新日期: 2023-09-27 18:37:02

我希望编译器为我推断出一种类型,但不确定是否可能,或者最好的选择是什么。

我想做:

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

并让 C# 推断TKey是一个int。有没有办法做这样的事情?如果没有,最好的选择是什么?

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

编辑:

对于将来看到这种情况的任何人,这里和这里都提出了类似的问题

高级类型推理

不,在 C# 中没有办法做到这一点。 您本质上要求的是能够显式指定一些通用参数并推断其余参数。 这在 C# 中不受支持;需要对所有泛型参数或不对泛型参数进行泛型类型推断。

@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);