为什么只有在没有泛型的情况下允许用户定义的转换?

时间:2017-06-03 21:02:40

标签: c# interface

using System;

public class Program
{
    public static void Main()
    {
        T<A> g = new T<A>();
        T2 g = new T2();
    }
}

public class T<A>
{
    public static extern implicit operator T<A> (A v);
}

public class T2
{
    public static extern implicit operator T2 (A v);
}

public interface A{}

Fiddle

代码仅适用于A的T.对于T2,它会给出错误&#34;编译错误(第19行,第26行):T2.implicit operator T2(A):用户定义的转换到接口或从接口转换是不允许&#34; ,为什么允许使用泛型?使用泛型作为解决方法是否有任何限制?

这个问题不是this question的重复,因为这个问题在于询问为什么允许使用泛型,并且如果对此变通办法有任何限制,那么为什么不允许用户定义的接口与接口之间的转换。< / p>

1 个答案:

答案 0 :(得分:2)

实际上两者都不起作用,但是您已将A类中的T<A>重新定义为通用参数。如果您将类重命名为T<B>并在适当的位置使用B,则会为通用转换提供相同的错误。

public class T<B>
{
    public static extern implicit operator T<B> (A v);
}

给出错误

  

编译错误(第14行,第26栏):T<B>.implicit operator T<B>(A):不允许用户定义与接口之间的转换

您遇到的问题与泛型无关,而是由于您尝试从接口进行隐式转换。如果您将A切换为类而不是接口,则两种方法都可以正常工作。

using System;

public class Program
{
    public static void Main()
    {
        T<A> g = new T<A>();
        T2 g2 = new T2();
    }
}

public class T<B>
{
    public static extern implicit operator T<B> (A v);
}

public class T2
{
    public static extern implicit operator T2 (A v);
}

public class A{}
相关问题