我堅持使用受介面約束的實作。我的用法對我來說很直觀,但沒有編譯,所以我誤解了一些東西。
我的界面:
interface IEntity
{
int ExampleMethod(IContext<IFooBar> context);
}
interface IContext<T> where T : class, IFooBar
{
T FooBar { get; set; }
}
interface IFooBar
{
int Value { get; }
}
我的實作:
class Entity : IEntity
{
public int ExampleMethod(IContext<IFooBar> context)
{
return context.FooBar.Value;
}
}
class Context : IContext<FooBar>
{
public FooBar FooBar { get; set; }
}
class FooBar : IFooBar
{
public int Value { get { return 10; } }
}
引發問題的物體類的用法
class UsageOfEntity
{
public UsageOfEntity()
{
var context = new Context();
var entity = new Entity();
int result = entity.ExampleMethod(context);
}
}
使用instancecontext
會報錯:
引數 1:無法從 'Context' 轉換為 'IContext<IFooBar>'
如何約束泛型型別引數以便可以使用我的實作?
uj5u.com熱心網友回復:
背景關系IContext<FooBar>
不是一個IContext<IFooBar>
。
因為OP在注釋中已經指出IContext<T>.FooBar
只需要只讀,T
可以做成協變的:
interface IContext<out T>
where T : class, IFooBar
{
T FooBar { get; }
}
現在,因為FooBar
implements IFoobar
,所以使用 aIContext<FooBar>
代替 a是有效的IContext<IFooBar>
:
uj5u.com熱心網友回復:
您的代碼中的問題是您正試圖轉換Context
為Type
IContext
您的錯誤告訴您的那樣。
{
public UsageOfEntity()
{
var context = new Context();
var entity = new Entity();
int result = entity.ExampleMethod(context);
}
}
你正試圖傳遞Context
到IContext
這一行
entity.ExampleMethod(context);
你應該把Type
傳入的ExampleMethod()
Context<FooBar>
. 我還想指出,為POCO
類創建介面是不必要的,只需將其保留為普通類即可。
您的代碼應如下所示:
class Entity : IEntity
{
public int ExampleMethod(Context<FooBar> context)
{
return context.FooBar.Value;
}
}
interface IEntity
{
int ExampleMethod(IContext<IFooBar> context);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/478555.html