首頁 >後端開發 >C++ >為什麼在 C# 中將 `MyEntityRepository` 轉換為 `RepositoryBase` 失敗?

為什麼在 C# 中將 `MyEntityRepository` 轉換為 `RepositoryBase` 失敗?

DDD
DDD原創
2025-01-06 02:07:41224瀏覽

Why Does Casting `MyEntityRepository` to `RepositoryBase` Fail in C#?

泛型與轉換:了解轉換限制

儘管這種情況很常見,但將繼承的類別轉換為基底類別可能很棘手,例如:嘗試以下程式碼時遇到執行時間異常:

public abstract class EntityBase { }
public class MyEntity : EntityBase { }

public abstract class RepositoryBase<T> where T : EntityBase { }
public class MyEntityRepository : RepositoryBase<MyEntity> { }

MyEntityRepository myEntityRepo = GetMyEntityRepo(); // whatever
RepositoryBase<EntityBase> baseRepo = (RepositoryBase<EntityBase>)myEntityRepo;

此轉換失敗,因為RepositoryBase實際上並不是MyEntityRepository 的基底類別。因此,從 MyEntityRepository 轉換到 RepositoryBase 就可以了。無效。

這種限制的根本原因在於通用變異數的概念。通用方差是指類型以協變或逆變方式變更其參數化的能力。但是,這種形式的泛型變體在 C# 中僅部分受支持,主要用於泛型介面和委託。

在更通用的上下文中,協變變體允許派生類型在給定場景中替換其基底類型。這意味著從 RepositoryBase 派生的類型 MyEntityRepository 可以取代 RepositoryBase。在大多數情況下。然而,由於潛在的運行時衝突,這個假設並不普遍有效。

例如,考慮RepositoryBase 中這樣的方法:

void Add(T entity) { ... }

將MyEntityRepository 轉換為RepositoryBase會打開向儲存庫新增非MyEntity 實例的大門,這是不可取的。這顯示不受限制的協變泛型變異數可能會損害程式架構的完整性。

在 C# 4 中,泛型介面和委託中的引用類型允許泛型方差,但類別不允許。有關更多詳細信息,請參閱 Microsoft 的 MSDN 文件、Eric Lippert 的博客系列或 2010 年 7 月在 NDC 上進行的演示視頻。

以上是為什麼在 C# 中將 `MyEntityRepository` 轉換為 `RepositoryBase` 失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn