Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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#_.net_Generics - Fatal编程技术网

C# 如何声明具有两个泛型类型参数的方法?

C# 如何声明具有两个泛型类型参数的方法?,c#,.net,generics,C#,.net,Generics,是否可以对函数返回值使用不同的通用参数类型(U),而对局部参数使用另一个通用参数类型T 我试过: private static U someMethod <T,U>(T type1, Stream s) 私有静态U方法(T类型1,流s) 及 私有静态U方法(T类型1,流s) 编辑: 我们同意尝试: private static U someMethod <T,U>(T type1, Stream s) public static T someMethodParen

是否可以对函数返回值使用不同的通用参数类型(
U
),而对局部参数使用另一个通用参数类型
T

我试过:

private static U someMethod <T,U>(T type1, Stream s)

私有静态U方法(T类型1,流s)


私有静态U方法(T类型1,流s)
编辑: 我们同意尝试:

private static U someMethod <T,U>(T type1, Stream s)

public static T someMethodParent<T>(Stream stream)
{

   U something = someMethod(type1, stream);  

      ...
}

私有静态U方法(T类型1,流s)
公共静态T someMethodParent(流)
{
U something=somethod(类型1,流);
...
}

私有静态U-someMethod(T类型1,流s)
是正确的语法

正如JavaSa在注释中所述,如果无法从用法中推断出实际类型,则需要提供它们,因此

private static U someMethodParent<T>(T Type1, Stream s)
{
    return someMethod<T, ConcreteTypeConvertibleToU>(type1, s);
}

私有静态U someMethodParent(T类型1,流s)
{
返回方法(类型1,s);
}
这应该行得通

private static U someMethod<T, U>(T type1, Stream s)
{
   return default(U);
}

私有静态U方法(T类型1,流s)
{
返回默认值(U);
}
这项工作:

private static TOutput someMethod<TInput, TOutput>(TInput from);
私有静态TOutput somethod(TInput from);

Loook

为了在someMethodParent中使用U,必须指定它,就像在someMethod中一样,例如

public static T someMethodParent<T, U>(T type1, Stream stream)
公共静态T someMethodParent(T类型1,流)
现在我可以在方法体中使用U作为someMethod的返回类型

{
    U something = someMethod<T, U>(type1, stream);
    return Default(T);
}
{
U something=somethod(类型1,流);
返回默认值(T);
}

好的,在阅读了所有评论之后,我觉得你有两个选择

  • 在someMethodParent的主体中显式指定所需的someMethod返回类型

    public static T someMethodParent<T>(Stream stream)
    {
        TheTypeYouWant something = someMethod<T, TheTypeYouWant>(type1, stream);
        ...
        return Default(T);
    }
    
    publicstatictsomemethodparent(流)
    {
    想要某物的类型=某物方法(类型1,流);
    ...
    返回默认值(T);
    }
    
  • 使用object作为someMethodParent主体中someMethod的返回类型,但仍需要转换为可用类型

    public static T someMethodParent<T>(Stream stream)
    {
        object something = someMethod<T, object>(type1, stream);
        ...
        TheTypeYouNeed x = (TheTypeYouNeed) something;
        // Use x in your calculations
        ...
        return Default(T);
    }
    
    publicstatictsomemethodparent(流)
    {
    objectsomething=somethod(类型1,流);
    ...
    你需要的类型x=(你需要的类型)某物;
    //在计算中使用x
    ...
    返回默认值(T);
    }
    


  • 这两个问题在其他答案的评论中都提到了,但没有举例说明。

    您遇到了什么错误?您的第一个版本看起来不错。
    私有静态U someMethod(T type1,Stream s){return default(U);}
    对我来说编译很好。“它们不工作”是什么意思,第一个应该编译并“工作”如果您只更改了方法签名,那么您将得到错误,因为您需要更改所有调用来指定U是什么。您可能没有指定T,因为它是根据您传递给方法的内容推断出来的,但必须显式地声明U。“虽然已经有了另一个泛型参数”-如果这是一个现有的方法,并且您一直依赖于类型推断,那么推断将不再有效-您需要在每个调用站点指定类型(无法推断
    U
    )它在我的电脑上工作。您使用的是什么版本的.Net和VS?.Net 4和VS 2010,请查看我的问题的注释一答案above@JavaSa-旁注-尽量不要按答案在此处的顺序引用答案-由于投票的方式,“上面的答案”可能(理论上)会在您撰写评论和其他人再次查看此问题之间进行切换。您可以在评论中包含链接(如何操作,请参阅常见问题解答),或者只使用其他回答者的姓名。问题是,我从
    someMethodParent()调用
    someMethod()
    哪个签名只有
    而没有
    U
    ,我不能重构
    someMethodParent()
    。方法
    someMethod()的类型参数(t,System.IO.Stream)“
    无法从用法中推断。请尝试显式指定类型参数。请参阅Feux回答中的我的约束,即我不能修改父方法或包含它的类。然后您可能会被搞砸,您在原始问题中显示的内容甚至不应该编译,例如U something=someMethod(type1,stream);应该告诉你,在这个上下文中没有定义U。(参见juharr对原始问题的评论)谢谢,但它不起作用,根据Feux的新答案尝试此操作时,出现了错误,
    U
    someMethod
    中的类型无法识别。这并不是说在这个答案中,我们假设MyClass的定义中没有泛型参数,
    U
    参数仅在
    someMethod
    中,因为您和Feux wroteNow我将尝试测试第二种方法听起来好像在实现某种方法时可能有问题。可能没有正确地将返回U。请查看我的屏幕截图:这几乎没有实现:)我正在工作,snag.gy站点在这里被阻止,所以我看不到屏幕截图。
    public static T someMethodParent<T>(Stream stream)
    {
        object something = someMethod<T, object>(type1, stream);
        ...
        TheTypeYouNeed x = (TheTypeYouNeed) something;
        // Use x in your calculations
        ...
        return Default(T);
    }