[英]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>();
這是錯誤的,編譯器足夠聰明,理解在這種情況下它不起作用,計算機語言不像英語,它們被創建為在所有條件下完全相同。 它們的設計使得語言規則在所有情況下都是正確的。 如果它們不同,您將發現混亂,找到錯誤的位置。
因為,如果T
是DerivedStoreItem
(繼承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.