2017-06-03 29 views
0
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

回答

2

其實兩者都不起作用,但是您已將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{} 
相關問題