C#cast泛型类型(如C ++用户定义的转换)

时间:2015-03-01 11:31:41

标签: c# generics casting

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,但它似乎不起作用。

2 个答案:

答案 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>();