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

问题描述:

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为什么用户定义的转换只能在没有泛型的情况下进行?

的代码只为T的作品A的带T2它给出了错误“编译错误(第19行,列26):T2.implicit operator T2(A):用户定义的转换或从接口不允许“,为什么它允许泛型?使用泛型作为解决方法是否有任何限制?

这个问题不是this question的重复,因为这个问题是问为什么它允许泛型,如果这个解决方法有任何限制,而不是为什么不允许用户定义的转换和从接口接口。

+2

你在'Main'中根本没有使用转换 - 在你给出的代码中什么都不起作用?你的问题很不清楚......(这里和'extern'有关吗?如果不是这样,我会删除它......基本上,把这个降到最低限度的例子。) –

+0

可能的重复[为什么不可能重复定义从接口到类的隐式转换运算符?](https://stackoverflow.com/questions/12533748/why-isnt-it-possible-to-define-implicit-cast-operator-from-interface-to-class) –

+0

外部不相关,但这样我就不必定义一个函数体。 – trinalbadger587

其实两者都不起作用,但是您已将T<A>类中的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{}