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);
}
好的,在阅读了所有评论之后,我觉得你有两个选择
public static T someMethodParent<T>(Stream stream)
{
TheTypeYouWant something = someMethod<T, TheTypeYouWant>(type1, stream);
...
return Default(T);
}
publicstatictsomemethodparent(流)
{
想要某物的类型=某物方法(类型1,流);
...
返回默认值(T);
}
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);
}