2010-03-26 4 views
4

Visual sutdio 2008에는 단위 테스트 스텁이 자동으로 만들어집니다. 나는 몇 가지 기본적인 단위 테스트를 작성하려면이를 사용했다,하지만 난 뭔가에 의해 혼란 스러워요 : T 일 때 : 나는 " 'T'로 유형 'StorageUnitTests.FileStoreTest.bla을'변환 할 수 없습니다 오류"이유는 무엇입니까C# Generics Casting

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>(); 
    } 

을 "bla"라고 입력 하시겠습니까?

"bla"는 좋은 함수 이름이 아니라 알고 있습니다.

답변

4

왜 그렇게하지 않습니까? T 경우 DerivedStoreItem (BaseStoreItem을 상속), 당신의 유형을 위반하는 것입니다

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

    T data = new T(); 

    target.StoreData(data); 
} 
+0

나는 새로운 T() 대신 Activator.CreateInstance가 ()이어야한다고 생각한다. –

+0

@Akash 왜? Activator.CreateInstance는 리플렉션을 사용하며 느립니다. 새로운 T()가 훨씬 더 우아하다고 생각합니다. – gsharp

+0

gsharp, 죄송합니다. 코드에서 new() 제약이 생겨서 new()가 지정되지 않았습니다. –

0

, 때문에 (당신이 T에 액세스 할 수있는 경우 그것은 StoreDataTestHelper의 즐 내부의 인스턴스를 생성하는 것이 훨씬 sence가되지 않습니다) FileStore<T>을 저장하여 BaseStoreItem을 저장합니다.

0

이것은 의미가 있습니다. T: BaseStoreItem을 지정하면 TBaseStoreItem을 기본 클래스로 사용하는 유형이되며 반드시 BaseStoreItem이 될 수 있습니다. 따라서 T가 나중에 BaseStoreItem에서 파생되는 형식으로 설정되면 target.StoreData(data); 줄이 잘못된 연산을 수행 할 수 있습니다.

귀하의 경우 만 blaT 세트 StoreDataTestHelper를 호출하지만

는 C#의 typechecker는 StoreDataTestHelper의 코드 입력 안전 일반적으로이 있는지 확인해야합니다. 강력한 형식의 언어에 대한 이점 중 하나입니다. 입력하기 전에 잠재적 인 타이핑 실수를 포착합니다.

1

when T is type "bla"

귀하의 위의 조건은 현재의 경우 마찬가지입니다,하지만 난 같아 클래스를 만들 수 있습니다

public class Bla2: BaseStoreItem {... 

그런 Bla2 <> 즐 ..., 어느 쪽도 Bla2는 즐에서 파생 된, 그래서 나는 경우입니다

StoreDataTestHelper<Bla2>(); 

는, 컴파일러는이 조건에서 작동하지 않습니다 것을 이해하기에 충분히 스마트 잘못이다이, 컴퓨터 언어는 영어 싫어하는 사용하려고, 그들은 exactl 작동하도록 만들어 모든 조건에서 동일합니다. 그리고 모든 경우에 언어 규칙이 정확하도록 설계되었습니다. 이들이 다르다면 오류가있는 곳을 혼란에 빠지게 할 것입니다.