naw*_*fal 4 .net c# extension-methods ushort parameter-passing
我有这个扩展方法:
public static bool In<T>(this T source, params T[] list)
{
return list.Contains(source);
}
Run Code Online (Sandbox Code Playgroud)
现在我需要使用上面的方法来实现ushort
.当我尝试
ushort p = 3;
if (p.In(1, 2, 3, 4, 5))
return;
Run Code Online (Sandbox Code Playgroud)
第一行蒙上3
一个ushort
很好.但是当3
作为参数传递时,我得到了错误
'ushort'不包含'In'的定义,最好的扩展方法重载'Extensions.In(T,params T [])'有一些无效的参数.
但这有效:
ushort p = 3;
if (Extensions.In(p, 1, 2, 3, 4, 5))
return;
Run Code Online (Sandbox Code Playgroud)
这很奇怪.
为什么它适用于第二个例子,但不是第一个例子?
什么是一个很好的选择,可以帮助我在这里?由于没有文字,short
或者ushort
我没有找到比手动转换每个整数更简单的替代方法:
ushort p = 3;
if (p.In((ushort)1, (ushort)2, (ushort)3, (ushort)4, (ushort)5))
return;
Run Code Online (Sandbox Code Playgroud)好吧,你定义了一个泛型函数,所以你必须定义它必须处理的确切类型.因为如果你给只是数字(1
,2
,3
,4
,等)的功能.他们可能只是什么:short
,ushort
,integer
...
所以你可以这样做:
要么
ushort p = 3;
if (p.In<ushort>(1, 2, 3, 4, 5))
return;
Run Code Online (Sandbox Code Playgroud)
或者像在第二个示例中所做的那样,将每个参数转换为所需的类型:
ushort p = 3;
if (p.In((ushort)1, (ushort)2, (ushort)3, (ushort)4, (ushort)5))
return;
Run Code Online (Sandbox Code Playgroud)
我个人更喜欢第一种情况.
编辑
在这种情况下它的工作原理如何:
ushort p = 3;
if (Extensions.In(p, 1, 2, 3, 4, 5))
return;
Run Code Online (Sandbox Code Playgroud)
是因为你明确地传递了一个this
(第一个参数),p
这是编译器的已知类型,所以它可以推断它.
该默认类型为1, 2, 3, 4, etc.
是int
.所以当你打电话
p.In(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)
T
被视为(或趋向于)integer
价值.由于编译器无法保证不会丢失任何数据(当您使用ushort
整数时),它会给出错误消息.它会强制您明确定义较小的类型.
注意:函数参数被定义为T[]
,所以你传递整数(至少编译器认为如此)但假装它是ushort
(因为你正在调用ext-method p
).
要获得证明,请尝试运行
int p = 3;
if (p.In(1, 2, 3, 4, 5))
return;
Run Code Online (Sandbox Code Playgroud)
这非常有效.