具有一般约束的C#重载

具有一般约束的C#重载,c#,generics,C#,Generics,为什么这两个方法不能有相同的名称?是因为C#编译器在重载时没有考虑泛型类型约束吗?在C#的未来版本中可以这样做吗 publicstatictvalue GetValueOrNull(此IDictionary字典,TKey) 其中TValue:类 { t价值; if(dictionary.TryGetValue(键,输出值)) 返回值; 返回null; } 公共静态价值?GetValueOrNull(此IDictionary字典,TKey) 其中TValue:struct { t价值; if(di

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

publicstatictvalue GetValueOrNull(此IDictionary字典,TKey)
其中TValue:类
{
t价值;
if(dictionary.TryGetValue(键,输出值))
返回值;
返回null;
}
公共静态价值?GetValueOrNull(此IDictionary字典,TKey)
其中TValue:struct
{
t价值;
if(dictionary.TryGetValue(键,输出值))
返回值;
返回null;
}

绝对正确。见本手册第3.6节:

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

(我的重点)

因此,两种方法的签名都是有效的:

GetValueOrNull<T1,T2>(IDictionary<T1,T2>,T1)
GetValueOrNull(IDictionary,T1)
以及:

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


在C#的未来版本中可以这样做吗


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

绝对正确。见本手册第3.6节:

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

(我的重点)

因此,两种方法的签名都是有效的:

GetValueOrNull<T1,T2>(IDictionary<T1,T2>,T1)
GetValueOrNull(IDictionary,T1)
以及:

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


在C#的未来版本中可以这样做吗


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

这里的名称不同。没什么问题。你犯了什么错误?他自己改了名字,应该是TValue GetValueOrNull和TValue?@Uriel_SVK的GetValueOrNull.mably duplicate:它不是重复的-OP希望通用约束将成为签名的一部分,而不是。请参阅,此处的名称不同。没什么问题。你犯了什么错误?他自己改了名字,应该是TValue GetValueOrNull和TValue?@Uriel_SVK的可能重复项:它不是重复项-OP希望通用约束将成为签名的一部分,而不是。请参阅和