簡體   English   中英

C#泛型鑄造

[英]C# Generics Casting

Visual Studio 2008能夠自動創建單元測試存根。 我用它來創建一些基本的單元測試,但我對此感到困惑:

  private class bla : BaseStoreItem
     {
     //
     }

  /// <summary>
  ///A test for StoreData
  ///</summary>
  public void StoreDataTestHelper<T>() where T : BaseStoreItem
     {
     FileStore<T> target = new FileStore<T>(); // TODO: Initialize to an appropriate value

     BaseStoreItem data = new bla();

     target.StoreData(data);
     }

  [TestMethod()]
  public void StoreDataTest()
     {
     //Assert.Inconclusive("No appropriate type parameter is found to satisfies the type constraint(s) of T. " +
     //        "Please call StoreDataTestHelper<T>() with appropriate type parameters.");

     StoreDataTestHelper<bla>();
     }

當T為“bla”類型時,為什么會出現“錯誤:無法將類型'StorageUnitTests.FileStoreTest.bla'轉換為'T'”?

我知道“bla”不是一個好的功能名稱,但它只是一個例子。

為什么不那樣? (如果你有權訪問T,那么在StoreDataTestHelper中創建一個bla實例並不是很有意義)

 public void StoreDataTestHelper<T>() where T : BaseStoreItem, new()
 {
     FileStore<T> target = new FileStore<T>(); 

     T data = new T();

     target.StoreData(data);
 }

當T是“bla”類型時

您的上述條件僅適用於當前案例,但我可以創建一個nother類

public class Bla2: BaseStoreItem {...

然后Bla2 <> bla ...,Bla2都不是來自bla,所以如果我嘗試使用

StoreDataTestHelper<Bla2>(); 

這是錯誤的,編譯器足夠聰明,理解在這種情況下它不起作用,計算機語言不像英語,它們被創建為在所有條件下完全相同。 它們的設計使得語言規則在所有情況下都是正確的。 如果它們不同,您將發現混亂,找到錯誤的位置。

因為,如果TDerivedStoreItem (繼承BaseStoreItem ),則會通過存儲BaseStoreItem來違反FileStore<T>BaseStoreItem

這是有道理的。 通過指定T: BaseStoreItem ,您可以保證T將是一個具有BaseStoreItem作為基類的類型,而不是它必然是BaseStoreItem 因此,如果稍后將T設置為從BaseStoreItem派生的某種類型,則使用target.StoreData(data); 線將執行非法操作。

雖然在你的情況下你只調用StoreDataTestHelper並將T設置為bla ,但C#的類型檢查器需要確保StoreDataTestHelper的代碼通常是類型安全的。 這是強類型語言的一個好處:它可以在你制作之前捕獲潛在的輸入錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM