为什么'int'可以被视为'ushort'而不是作为扩展方法中的参数传递而且它是一个优雅的解决方案?

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)

这很奇怪.

  1. 为什么它适用于第二个例子,但不是第一个例子?

  2. 什么是一个很好的选择,可以帮助我在这里?由于没有文字,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)

Tig*_*ran 5

好吧,你定义了一个泛型函数,所以你必须定义它必须处理的确切类型.因为如果你给只是数字(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)

这非常有效.