我不敢相信我多年的 C# 經驗花了我這么長時間才發現以下限制,我不敢相信這是不可避免的,如果有人能相反地啟發我,我會非常高興。考慮以下:
namespace ConsoleApp1;
internal class BaseClass { }
internal class DerivedClass : BaseClass { }
internal class CastingExperiment
{
public void AssignmentAttempts<TBase>(object anyRandomThing)
where TBase : BaseClass
{
BaseClass baseClass = new DerivedClass();
TBase wantToDoThis = new BaseClass(); // Compiler says no, cannot implicitly convert type
TBase haveToDoThis = (TBase)baseClass;
TBase whichIsAsEvilAsThis = (TBase)anyRandomThing;
}
}
在這種情況下,我會盡快避免顯式轉換,型別約束就在那里告訴編譯器它需要知道什么關于賦值兼容性,但仍然需要轉換。
我也嘗試過從CastingExperiment介面派生并使用協變或逆變約束TBase,它仍然堅持強制轉換。我錯過了什么嗎?
uj5u.com熱心網友回復:
約束where TBase : BaseClass意味著它TBase可以是任何型別,它 BaseClass可以是BaseClass或任何從它派生的。
當您使用創建新實體時,new BaseClass();您應該具有相同型別的參考 ( BaseClass),但您的參考型別是TBase(可以是任何派生型別)。
所以當你這樣呼叫你的方法時:
someInstance.AssignmentAttempts<DerivedClass>(someArg);
那么非作業行將導致如下結果:
DerivedClass wantToDoThis = new BaseClass(); // check the reference type
如果您只是以這種方式撰寫代碼(沒有泛型),您將收到編譯時錯誤。
您可以將派生型別轉換為基本型別,但反之則不行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494543.html
下一篇:函式指標的轉換
