代码之家  ›  专栏  ›  技术社区  ›  Nippysaurus

C普通铸造

  •  4
  • Nippysaurus  · 技术社区  · 14 年前

    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”不是一个好的函数名,但它只是一个例子。

    4 回复  |  直到 6 年前
        1
  •  4
  •   gsharp    14 年前

    为什么不这样? (如果您有权访问t,那么在storedatatesthelper中创建bla的实例并不重要)

     public void StoreDataTestHelper<T>() where T : BaseStoreItem, new()
     {
         FileStore<T> target = new FileStore<T>(); 
    
         T data = new T();
    
         target.StoreData(data);
     }
    
        2
  •  1
  •   Akash Kava    14 年前

    当t为“bla”类型时

    以上条件仅适用于当前情况,但我可以创建其他类

    public class Bla2: BaseStoreItem {...
    

    然后是bla2<gt;bla…,bla2都不是从bla派生的,所以如果我尝试使用

    StoreDataTestHelper<Bla2>(); 
    

    这是错误的,编译器足够聪明,可以理解在这种情况下它不会工作,计算机语言不像英语,它们被创建来在所有条件下工作完全相同。它们的设计使语言规则在任何情况下都是正确的。如果它们不同,你会发现错误在哪里。

        3
  •  0
  •   Tormod Fjeldskår    14 年前

    因为,如果 T DerivedStoreItem (继承) BaseStoreItem ,您将违反 FileStore<T> 通过存储 基础项目 .

        4
  •  0
  •   smehmood    14 年前

    这是有道理的。通过指定 T: BaseStoreItem ,你保证 T 将是具有的类型 BaseStoreItem 作为一个基本类,而不是它必然是一个 基础项目 . 因此,如果t稍后设置为派生自 基础项目 你的 target.StoreData(data); 行将执行非法操作。

    尽管在您的情况下,您只调用 StoreDataTestHelper 具有 T 设置为 bla ,C的类型检查程序需要确保 存储数据测试帮助程序 通常是类型安全的。这是强类型语言的一个好处:它可以在您输入之前捕获潜在的输入错误。