爲什麼我會爲下面的一段代碼獲得類型轉換編譯錯誤?使用通用助手類隱式強制類
我已經在我的項目衍生防守/視圖類的好幾件事。他們都有一些代碼庫,比如說持久性,檢索等。我認爲通過編寫一個使用泛型的助手類可以實現這個通用代碼庫的可維護性。
但是我得到了對分配以高清行DoSomeStuff法「類型轉換」編譯錯誤。我已經小心地爲所有基類和派生類編寫隱式強制轉換。
注意防守&視圖類故意不從一些常見的類派生。此外,我總是希望只從View轉換爲Def,而不是其他方式,因此只有我的View類具有在其上定義的隱式轉換。
我的確嘗試遵循Eric Lipert關於協變性和逆變性的討論,但隨着他的例子的進展,我的腦海裏變得相當混亂。任何有關這個問題的幫助,不勝感激。
public class BaseDef
{
public int Id { get; set; }
}
public class DerivedDef : BaseDef
{
public string Name { get; set; }
public DerivedDef()
: base()
{
}
public DerivedDef(BaseDef bd)
{
this.Id = bd.Id;
}
}
public class BaseView
{
public int Id { get; set; }
public BaseView()
{
}
public BaseView(BaseDef bd)
{
Id = bd.Id;
}
public BaseDef ToBaseDef()
{
return new BaseDef { Id = this.Id };
}
public static implicit operator BaseView(BaseDef bd)
{
return new BaseView(bd);
}
public static implicit operator BaseDef(BaseView bv)
{
return bv.ToBaseDef();
}
}
public class DerivedView : BaseView
{
public string Name { get; set; }
public DerivedView()
: base()
{
}
public DerivedView(DerivedDef dd)
: base(dd)
{
Name = this.Name;
}
public DerivedDef ToDerivedDef()
{
return new DerivedDef(this)
{
Name = this.Name,
};
}
}
public class SomeHelper<Tdef, Tview>
where Tdef : BaseDef
where Tview : BaseView
{
public void DoSomeStuff(Tview vm)
{
Tdef df = vm; // this line give a compile error 'Cannot convert type 'Tview' to 'Tdef'
// work with df from here on
}
}
你給的代碼編譯罰款。你的意思是將'df'聲明爲'Tdef'類型而不是'var'嗎? (順便提一下,我懷疑你可以大大簡化你的例子。) –
你確定這是你得到的確切線和錯誤?我不明白這是如何可能的,因爲「df」沒有明確輸入。你使用了「var」,所以它的類型只是右手邊的暗示。那裏不會有任何轉換。 –
@Jon,你說得對。我的錯誤,我糾正了這條線。我會非常感興趣的聽你的想法... – kapil