轉換

2013-11-04 135 views
2

我有MyClass<T>類,其中T是一些接口:轉換

class MyClass<T> where T: IMyInterface 

我寫了幾類,其使用的IMyInterface一些實施延長MyClass,例如:

class MySecondClass : MyClass<MyInterfaceImplementation> 

爲什麼assignement MySecondClass實例不允許使用類型爲MyClass<IMyInterface>的變量?

MyClass<IMyInterface> x = new MySecondClass() 

當我添加的隱式轉換:

public static implicit operator MyClass<IMyInterface>(MySecondClass c) { 
    return c; 
} 

它開始工作。

+0

需要約束的接口。 'interface IMyClass where T:IMyInterface'。 – Romoku

+0

@Romoku你不能使用泛型約束與類。僅接口 – Alex

回答

2

做你想做什麼,你應該聲明的類型參數T是協變使用out關鍵字(請參閱MSDN上Covariance and Contravariance in Generics)。
你會需要修改你的代碼一點點,因爲協方差和逆變只能在接口定義:

interface IMyInterface { 
} 

// note that this one is an interface now 
interface IMyClass<out T> where T : IMyInterface { 
} 

class MyInterfaceImplementation : IMyInterface { 
} 

class MySecondClass : IMyClass<MyInterfaceImplementation> { 
} 

class Program { 
    static void Main(string[] args) { 
     IMyClass<IMyInterface> x = new MySecondClass(); 
    } 
} 
+0

太棒了!我不知道這個選擇。它大大簡化了事情! – jkokorian

0

這是因爲泛型類(C++術語中的模板)和設計的本質。

例如:

MyClass<object> o = new MyClass<string>(); 

也將編譯失敗。泛型類不是僅僅因爲它們的泛型就是對方的後代。它們實際上是不同的類,在面向對象的意義上彼此沒有關係。

1

MyClass<IMyInterface> and MySecondClass兩個不同的類和編譯器不能隱式地將一種類型的對象轉換爲另一種類型的對象。

而且更這兩個類都只有System.Object作爲公共基類

+0

'MySecondClass'繼承自'MyClass ','MyInterfaceImplementation'實現'IMyInterface'。我可以編寫簡單的隱式轉換器'public static implicit operator MyClass (MySecondClass c){return c;}'並開始工作。 – Ari