Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写一个扩展方法,可以为同一输入返回不同的类型?_C# - Fatal编程技术网

C# 如何编写一个扩展方法,可以为同一输入返回不同的类型?

C# 如何编写一个扩展方法,可以为同一输入返回不同的类型?,c#,C#,我想写这样的东西: public static Int16 Parse(this byte[] buffer, int index) { var v = buffer[index++] << 8; v += buffer[index++]; return (Int16)v; } public static Int32 Parse(this byte[] buffer, int index) {

我想写这样的东西:

    public static Int16 Parse(this byte[] buffer, int index)
    {
        var v = buffer[index++] << 8;
        v += buffer[index++];
        return (Int16)v;
    }

    public static Int32 Parse(this byte[] buffer, int index)
    {
        var v = buffer[index++] << 24;
        v += buffer[index++] << 16;
        v += buffer[index++] << 8;
        v += buffer[index++];
        return (Int16)v;
    }
publicstaticint16解析(这个字节[]缓冲区,int索引)
{
var v=缓冲区[index++]
有没有办法用显式泛型参数实现我想要的功能

没有

我的意思是,您可以将该方法声明为
T Parse(这个byte[]buffer,int index)
,这将解决返回值问题。但是,在该方法中,您仍然存在常规处理输入的问题。您需要检查
T
,以确定要“解析”的字节数(您并不是真正在解析……它更像是一个字节转换/重新解释转换操作,而“解析”通常指将文本转换为数据)


您只需遵循
Convert
BitConverter
binarydreader
类的示例就可以做得更好,这些类在方法名称本身中包含类型名称。无论如何,每个方法都需要不同的实现,而且您知道无论如何都需要显式指定类型名称,所以请保持简单e、

通常的解决方案是使用不同的名称-通常是基于类型的后缀

在这种特定的情况下,您的方法是多余的-至少在某些框架中,有用于此的框架方法;您实际上是在实现:

  • BinaryPrimitives.ReadInt16BigEndian(…)
  • BinaryPrimitives.ReadInt32BigEndian(…)

(偏移量的指定方式略有不同;在使用跨度的
二进制原语
版本中,偏移量是通过
切片
实现的)

这里通常的解决方案是调用它们
ParseInt16
ParseInt32
,因为C不允许按返回类型重载来回答这个问题,不,你不能只按返回类型重载方法。而且因为这些方法不是“泛型的”然后,使用不同的名称是正确的解决方案。随机问题:为什么第二个版本会简化为
short
(丢弃刚刚填充的值的一半);应该是
return v
?@DStanley我觉得您可以将类型作为名称的一部分,例如
buffer.Parse(index)但这可能只是简单的错误,或者是我与C++ + .@ MR.BOY混合的东西,但根据类型不同,代码不通用,因为你必须根据返回类型指定通用参数,你也可以只使用不同的方法名称。;
变量x=Parse(y,z)
在特定的情况下,我想我可能会说我想让Endian nes成为一个参数,但我想你可能是对的。我发现在我的另一个问题中,我已经发现这是一个值得问的问题,因为我需要纯语言知识。我想你的意思是
Span
而不是
Slice
,不过?@Mr.Boy我是指两者;一旦你有一个span(一个数组也可以作为span),你可以对它进行切片以应用偏移量和限制;你的
index
用法相当于
someSpan.slice(index)
BinaryPrimitives
一起切片(index)
,谢谢-我刚刚离开文档,我以前从未使用过
span
(或者知道它存在)
    public static Int16 <Int16>Parse(this byte[] buffer, int index)
    {
        var v = buffer[index++] << 8;
        v += buffer[index++];
        return (Int16)v;
    }