C#中是否有办法为泛型类型执行用户定义的转换?
例如:
class Stack<T>
{
private T x; //should be an array but doesn't matter for this example
public Stack(T input)
{
x = input;
}
public Stack<Q> Convert<Q>(Stack<T> inputStack)
{
//what would go here ? The call is below.
}
}
//main code
Stack<int> stack = new Stack<int>(2);
Stack<long> longstack = stack.Convert<long>(stack);
我认为编译器可以在转换函数中推断Q很长并且T是int,但它似乎不起作用。
答案 0 :(得分:3)
不,因为类级泛型类型参数不能自动使用。
我认为编译器可以推断出Q很长而T是 转换函数中的int,但它似乎不起作用。
也许,但在一天结束时,泛型类型参数不属于构造函数。也就是说,您根据构造函数参数/参数为类型提供泛型参数?如果不仅仅是构造函数参数会发生什么?
public class A<T>
{
// Which one should be used to auto-infer T from usage?
// Maybe the integer? Or the bool? Or just the string...?
// Every choice seems a joke, because it would be absolutely
// arbitrary and unpredictable...
public A(int x, string y, bool z)
{
}
}
现在以示例代码为例。它有同样的问题:应该从Convert
静态方法使用什么参数来推断使用中的泛型类型参数?如果Convert
不仅仅有一个参数,会发生什么??
答案 1 :(得分:1)
这是标准Stack类的扩展方法(你可以稍微重写它并在你自己的Stack类中使用类似的实例方法):
public static class MyStackExtensions
{
public static Stack<TDest> Convert<TSrc, TDest>(
this Stack<TSrc> stack,
Func<TSrc, TDest> converter = null)
{
if (stack == null)
throw new ArgumentNullException("stack");
var items = converter == null
? stack.Select(i => (TDest) System.Convert.ChangeType(i, typeof (TDest)))
: stack.Select(converter);
return new Stack<TDest>(items.Reverse());
}
}
使用转换函数将堆栈从int转换为long - 不需要类型参数: - )
var intStack = new Stack<int>(new[] { 1, 2, 3 });
var longStack = intStack.Convert(i => (long)i);
或使用标准转换:
var intStack = new Stack<int>(new[] { 1, 2, 3 });
var longStack = intStack.Convert<int, long>();