我想將介面向下轉換IEntity<TM, TV, TP>
為IEntity<IModel, IView, IPresenter>
,但它給了我無效的轉換例外。我添加了一些約束(where),但它也沒有幫助。
注意:我不完全確定這會做什么,在我的情況下是向上還是向下
最好在我嘗試使用時展示示例。
// Simple class, doesnt inherits anything.
// This class can't be generic
public class EntitiesContainer
{
private List<IEntity<IModel, IView, IPresenter>> _entities = new ();
// Adds IEntity<TM, TV, TC> to list of entities;
public void Add<TM, TV, TC>(IEntity<TM, TV, TC> entity)
where TM : IModel
where TV : IView
where TC : IPresenter
{
_entities.Add((IEntity<IModel, IView, IPresenter>)entity); // invalid cast
//or it says: argument type IEntity<TM, TV, TC> is not assignable to IEntity
//_entities.Add(entity); //syntax error
}
// some other methods below...
}
物體:
public interface IEntity<TM, TV, TP>
where TM : IModel
where TV : IView
where TP : IPresenter
{
TM Model { get; }
TV View { get; }
TP Presenter { get; }
}
這個例子我想添加 IEntity 到串列。Class有一個List IEntity<IModel, IView, IPresenter>
,但是IEntity
用泛型引數添加是個問題。例如IEntity<ImplModel, ImplView, ImplPresenter
,因為它不能向下轉換/向上轉換為 <IEntity<IModel, IView, IPresenter>>
ImplModel、ImplView、ImplPresenter——它們都分別實作了它的介面(IModel、IView、IPresenter)
我做了一些研究。看起來我需要使用一種叫做 generics covariance的東西。通過檔案,我需要在課堂上進進出出。但是我有特定泛型的串列,輸入或輸出都無濟于事。
任何幫助都會有所幫助。謝謝。
uj5u.com熱心網友回復:
您可以將out
說明符添加到IEntity
介面宣告中,然后完全洗掉強制轉換
class TestModel:IModel{}
class TestView:IView{}
class TestPresenter:IPresenter{}
class TestEntity : IEntity<TestModel, TestView, TestPresenter>{}
// Simple class, doesnt inherits anything.
// This class can't be generic
public class EntitiesContainer
{
private List<IEntity<IModel, IView, IPresenter>> _entities = new ();
public void Test() => Add(new TestEntity());
// Adds IEntity<TM, TV, TC> to list of entities;
public void Add(IEntity<IModel, IView, IPresenter> entity)
{
_entities.Add(entity); // not cast at all
}
// some other methods below...
}
//------->>>Main changes here - *out* TModel, etc!!!
public interface IEntity<out TModel, out TView, out TPresenter>
where TModel : IModel
where TView: IView
where TPresenter : IPresenter
{
}
public interface IPresenter{}
public interface IView{}
public interface IModel{}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/536500.html
標籤:C#哎呀仿制药界面