【问题标题】:C# overloading with generic constraints具有泛型约束的 C# 重载
【发布时间】:2014-04-29 08:21:20
【问题描述】:

为什么这两个方法不能同名?是因为 C# 编译器在重载时没有考虑泛型类型约束吗?可以在未来的 C# 版本中实现吗?

public static TValue GetValueOrNull<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key)
            where TValue : class
{
    TValue value;
    if (dictionary.TryGetValue(key, out value))
        return value;
    return null;
}

public static TValue? GetValueOrNull<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key)
        where TValue : struct
{
    TValue value;
    if (dictionary.TryGetValue(key, out value))
        return value;
    return null;
}

【问题讨论】:

标签: c# generics


【解决方案1】:

完全正确。见C# Language Spec (version 5)的第3.6节:

方法的签名由方法的名称、类型参数的数量以及每个形式参数的类型和种类(值、引用或输出)组成,在从左到右的顺序。 出于这些目的,出现在形参类型中的方法的任何类型参数都不是通过其名称来标识的,而是通过它在方法的类型参数列表中的序号位置来标识的方法的签名明确地不包括返回类型、可以为最右边的参数指定的params修饰符,也不包括可选的类型参数约束。 p>

(我的重点)

所以这两种方法的签名都是有效的:

GetValueOrNull<T1,T2>(IDictionary<T1,T2>,T1)

还有:

方法重载允许类、结构或接口声明多个具有相同名称的方法,只要它们的签名在该类、结构或接口中是唯一的


可以在未来的 C# 版本中实现吗?

我对此表示怀疑,除非或直到类型推断成为更容易解决的问题。类型推断可能已经花费了大量时间,因为编译器通常必须执行蛮力方法。考虑到当前的机器,它还必须同时考虑过载解决可能会非常昂贵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多