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# 控制台应用程序时出现的问题

c# - WPF 自定义控件构造、触发器和事件

c# - 在将 "this"参数命名为 C# 中的扩展方法时,您更喜欢哪种成语(如果有),为什么?

c# - 在 C# 中使用扩展方法而不是实例方法的缺点

c# - 合取和析取帮助类

c# - 我应该为表中的密码字段使用什么? MD5 还是 SHA1?

c# - 如何创建具有动态对象类型的列表

c# - 无法将新实例添加到泛型类中的泛型列表。为什么?

.net - 存储 SQL 连接详细信息 - 如何安全地加密每个用户?

c# - 定义委托(delegate)的两种方式