2013-08-15 20 views
8

Uruchomiłem mój kod przez pokrycie kodu, a poniższy wiersz pokazuje 1 blok jako nieobjęty.Utworzenie nowej instancji ogólnego parametru typu, który nie jest objęty kodem

Czy ktoś może mi powiedzieć, która część tej linii nie jest wykonywana?

enter image description here

Przykład grać z:

public abstract class Base 
{ 
    public abstract IExample CreateEntity<TExample>() where TExample : IExample, new(); 
} 

public class Class1 : Base 
{ 
    public override IExample CreateEntity<TExample>() 
    { 
     IExample temp = new TExample(); 
     return temp; 
    } 
} 

public interface IExample 
{ 

} 

public class TEx : IExample 
{ 

} 

i metody badania

[TestMethod] 
    public void TestMethod1() 
    { 
     Class1 ex = new Class1(); 
     ex.CreateEntity<TEx>(); 
    } 
+0

Did próbujesz upuścić 'temp', aby uczynić go' return new TExample() '? – dasblinkenlight

+1

Czy gdzieś jest mowa o "info"? – GalacticCowboy

+0

@dasblinkenlight [nadal informuje o 20% braku zasięgu] (http://i.stack.imgur.com/JXdb8.png), nawet jeśli jest to jedna linia, dziwne. –

Odpowiedz

6

zmienić więzów zmusić TExample być klasa:

public abstract IExample CreateEntity<TExample>() where TExample : class, IExample, new(); 

Jeśli uruchomić skompilowany kod za pomocą narzędzia jak ILSpy, pojawi się blok, który nie jest uzyskanie pokrycia:

TExample temp = (default(TExample) == null) ? Activator.CreateInstance<TExample>() : default(TExample); 
return temp; 

To przeprowadza kontrolę, aby sprawdzić, czy typ przeszedł do ogólnej był typem odniesienia lub typ wartości. Zmuszając to do zajęcia, kontrola ta zostanie usunięta. Czytaj więcej na domyślnego hasła tutaj: http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx

Innym sposobem uzyskania pełnego pokrycia kodu byłoby użyć struct, który implementuje IExample:

public struct S1 : IExample 
{ 
} 

a następnie dodać ten test:

[TestMethod] 
public void StructTest() 
{ 
    Class1 ex = new Class1(); 
    ex.CreateEntity<S1>(); 
} 
Powiązane problemy