2012-12-13 74 views
2

如果我有這樣的接口:c#接口 - 隱式轉換錯誤?

public interface IFoo : IDisposable 
{ 
    int PropA {get; set;} 
    int PropB {get; set;} 
} 

和A類:

public class Foo : IFoo 
{ 
    public int PropA {get; set;} 
    public int PropB {get; set;} 

    public void Dispose() 
    { 
     Dispose(); 
     GC.SuppressFinalize(this); 
    } 
} 

不應該沒有這項工作 '不能隱式轉換' 的錯誤?

private Context context = new Context(); 
    private GenericRepository<IFoo> FooRepo; 

    public GenericRepository<IFoo> Article 
    { 
     get 
     { 
      if (this.FooRepo == null) 
      { 
       this.FooRepo = new GenericRepository<Foo>(context); 
      } 
      return FooRepo; 
     } 
    } 

我以爲我做對了,做這件事的正確方法是什麼?

+1

'this.FooRepo = new GenericRepository (context);' –

+1

您可以使用這種方法:http://stackoverflow.com/questions/222403/casting-an-object-to-a-generic-interface – MUG4N

+2

一般規則接口:僅爲類使用類類型建設;在其他地方使用接口類型。 – dthorpe

回答

3

什麼你正在試圖做的(分配GenericRepository<Foo>參考GenericRepository<IFoo>類型的字段)將僅GenericRepository<T>在其泛型類型參數爲covariant工作。爲此,GenericRepository<>將被定義爲:

public class GenericRepository<out T> {...} //note the "out" modifier. 

那麼這個任務將是確定:

this.FooRepo = new GenericRepository<IFoo>(context); 

然而,由於協僅限於接口代表將無法工作。所以,爲了這個限制之內玩,你可以定義一個協IGenericRepository<T>界面和使用,而不是類接口:

public interface IGenericRepository<out T> {} 
public class GenericRepository<T> : IGenericRepository<T> { } 

private Context context = new Context(); 
private IGenericRepository<IFoo> FooRepo; 

public IGenericRepository<IFoo> Article 
{ 
    get 
    { 
     if (this.FooRepo == null) 
     { 
      this.FooRepo = new GenericRepository<Foo>(context); 
     } 
     return FooRepo; 
    } 
} 

另外,如果GenericRepository<T>工具IEnumerable可以使用Enumerable.Cast<T>方法:

public IGenericRepository<IFoo> Article 
{ 
    get 
    { 
     if (this.FooRepo == null) 
     { 
      this.FooRepo = new GenericRepository<Foo>(context).Cast<IFoo>(); 
     } 
     return FooRepo; 
    } 
} 
1

您試圖將上下文隱式轉換爲Foo,而不是它的接口。另外,Context是否實施IFoo?如果是的話,這應該工作。

試試這個:

private Context context = new Context(); 
private GenericRepository<IFoo> FooRepo; 

public GenericRepository<IFoo> Article 
{ 
    get 
    { 
     if (this.FooRepo == null) 
     { 
      this.FooRepo = new GenericRepository<IFoo>(context); 
     } 
     return FooRepo; 
    } 
}