c# - 为什么 'int' 可以被视为 'ushort' 而不是在扩展方法中作为参数传递时,什么是优雅的解决方案?

标签 c# .net extension-methods parameter-passing ushort

我有这个扩展方法:

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;

这很奇怪。

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

  2. 什么是对我有帮助的好选择?由于 shortushort 没有文字,所以我找不到比像这样手动转换每个整数更简单的替代方法:

    ushort p = 3;
    if (p.In((ushort)1, (ushort)2, (ushort)3, (ushort)4, (ushort)5))
       return;
    

最佳答案

好吧,您定义了一个泛型函数,所以您必须定义它必须处理的确切类型。因为如果您只向函数提供数字(1234 等)。它们可以是任何:shortushortinteger...

所以你可以这样做:

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/

相关文章:

c# - 在列表排序中更改什么以正确排序

c# - 什么在 visual studio 2013 中创建目录 "app.publish"?

c# - 破译触发事件的控件

c# - 如何向枚举添加多个属性?

.net-3.5 - 扩展方法命名空间和赞助商类的命名约定

c# - 仅使用扩展方法在 Linq 中进行漂亮、干净的交叉连接

c# - 如何获取Azure应用服务资源中的文件路径?

c# - 通过 installutil 将参数传递给服务安装程序

c# - Microsoft 团队机器人 - 无法解析租户 ID

c# - 了解 Blazor 中的覆盖参数问题