2015-04-03 1 views
0

Попробованная этот код:Возвращает тот же тип экземпляра в качестве типа входа в дженериков

public static T NotEmpty<T, X> (T instance, string paramName = null) where T : IEnumerable<X> 
{ 
    if (instance != null) 
     if (instance.Any()) 
      return instance; 

    throw new Exception(); 
} 

static void Main (string[] args) 
{ 
    var list = new List<int>() { 1, 2, 3 }; 
    var t = NotEmpty (list); 
} 

EDIT: Так что я хочу передать любой тип, который реализует IEnumerable как List<int> и возвращать экземпляр одного типа (LIst<int>).

error: var t = NotEmpty (list); The type arguments for method NoName.Program.NotEmpty<T,X>(T, string) cannot be inferred from the usage. Try specifying the type arguments explicitly.

+0

где же говорит, что компилятор, в каком месте? – Thomas

ответ

2

Я считаю, что вам не нужны два общих параметра. Вы можете заменить T в IEnumerable<T>

public static IEnumerable<T> NotEmpty<T> (IEnumerable<T> instance, string paramName = null) 
{ 
    if (instance != null && instance.Any()) 
     return instance; 

    throw new Exception(); 
} 

Demo.