我有这个扩展方法:
public static bool In<T>(this T source, params T[] list)
{
return list.Contains(source);
}
现在我需要对 ushort
使用上述方法。当我尝试
ushort p = 3;
if (p.In(1, 2, 3, 4, 5))
return;
第一行将 3
转换为 ushort
井。但是当 3
作为参数传递时,我得到了错误
'ushort' does not contain a definition for 'In' and the best extension method overload 'Extensions.In(T, params T[])' has some invalid arguments.
但这行得通:
ushort p = 3;
if (Extensions.In(p, 1, 2, 3, 4, 5))
return;
这很奇怪。
为什么它适用于第二个示例,但不适用于第一个?
什么是对我有帮助的好选择?由于
short
或ushort
没有文字,所以我找不到比像这样手动转换每个整数更简单的替代方法:ushort p = 3; if (p.In((ushort)1, (ushort)2, (ushort)3, (ushort)4, (ushort)5)) return;
最佳答案
好吧,您定义了一个泛型函数,所以您必须定义它必须处理的确切类型。因为如果您只向函数提供数字(1
、2
、3
、4
等)。它们可以是任何:short
、ushort
、integer
...
所以你可以这样做:
或
ushort p = 3;
if (p.In<ushort>(1, 2, 3, 4, 5))
return;
或者像您在第二个示例中所做的那样,将每个参数转换为所需的类型:
ushort p = 3;
if (p.In((ushort)1, (ushort)2, (ushort)3, (ushort)4, (ushort)5))
return;
我个人更喜欢第一种情况。
编辑
为什么它在这种情况下有效:
ushort p = 3;
if (Extensions.In(p, 1, 2, 3, 4, 5))
return;
是因为您显式像this
(第一个参数)一样传递p
,这是一个已知类型对于编译器,因此它可以推断它。
1、2、3、4 等
的默认类型是int
。所以当你调用
p.In(1, 2, 3, 4, 5)
T
被视为(或倾向于)为 integer
值。由于编译器无法保证不会丢失任何数据(当您对整数使用 ushort
时),它会给出一条错误消息。它会强制您显式定义一个较小的类型。
请注意:函数参数定义为 T[]
,因此您传递整数(至少编译器是这样认为的)但假装它是 ushort
(正如您重新从 p
调用 ext-method)。
为了证明,尝试运行
int p = 3;
if (p.In(1, 2, 3, 4, 5))
return;
这非常有效。
关于c# - 为什么 'int' 可以被视为 'ushort' 而不是在扩展方法中作为参数传递时,什么是优雅的解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13729869/