高级类型推断
Advanced Type Inference
我希望编译器为我推断类型,但我不确定这是否可能,或者最好的选择是什么。
我想做:
public static TValue Get<TValue>(TKey key) where TValue : Mapped<TKey> { ... }
public class MyObject : Mapped<int> { ... }
并让 C# 推断 TKey
是一个 int
。有没有办法做这样的事情?如果没有,最好的选择是什么?
我想避免做类似 Get<MyObject, int>(1);
的事情
编辑:
以后有谁看到这个,问过类似的问题here and here
不,在 C# 中无法执行此操作。您本质上要求的是能够明确指定一些通用参数并推断其余参数。这在 C# 中不受支持;需要对所有或 none 个通用参数进行通用类型推断。
@Servy 是正确的,但正如在其他线程中指出的那样,有时您可以拆分类型以使事情变得可推断。
在此示例中,我们在 class 声明中指定不可推断类型,在方法声明中指定可推断类型。
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);
我希望编译器为我推断类型,但我不确定这是否可能,或者最好的选择是什么。
我想做:
public static TValue Get<TValue>(TKey key) where TValue : Mapped<TKey> { ... }
public class MyObject : Mapped<int> { ... }
并让 C# 推断 TKey
是一个 int
。有没有办法做这样的事情?如果没有,最好的选择是什么?
我想避免做类似 Get<MyObject, int>(1);
编辑:
以后有谁看到这个,问过类似的问题here and here
不,在 C# 中无法执行此操作。您本质上要求的是能够明确指定一些通用参数并推断其余参数。这在 C# 中不受支持;需要对所有或 none 个通用参数进行通用类型推断。
@Servy 是正确的,但正如在其他线程中指出的那样,有时您可以拆分类型以使事情变得可推断。
在此示例中,我们在 class 声明中指定不可推断类型,在方法声明中指定可推断类型。
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);