为什么用户定义的转换只能在没有泛型的情况下进行?
问题描述:
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的重复,因为这个问题是问为什么它允许泛型,如果这个解决方法有任何限制,而不是为什么不允许用户定义的转换和从接口接口。
答
其实两者都不起作用,但是您已将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{}
你在'Main'中根本没有使用转换 - 在你给出的代码中什么都不起作用?你的问题很不清楚......(这里和'extern'有关吗?如果不是这样,我会删除它......基本上,把这个降到最低限度的例子。) –
可能的重复[为什么不可能重复定义从接口到类的隐式转换运算符?](https://stackoverflow.com/questions/12533748/why-isnt-it-possible-to-define-implicit-cast-operator-from-interface-to-class) –
外部不相关,但这样我就不必定义一个函数体。 – trinalbadger587