C # универсальный вопрос о типе интерфейса - PullRequest
1 голос
/ 07 июня 2011

Я не уверен, как сформулировать этот вопрос кратко, не приводя пример, вот так:

public interface IThing<T>
{
    void Do(T obj);
}

public class ThingOne : IThing<int>
{
    public void Do(int obj)
    {
    }
}

public class ThingTwo : IThing<string>
{
    public void Do(string obj)
    {
    }
}

public class ThingFactory
{
    public IThing<T> Create<T>(string param)
    {
        if (param.Equals("one"))
            return (IThing<T>)new ThingOne();

        if (param.Equals("two"))
            return (IThing<T>)new ThingTwo();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var f = new ThingFactory();

        // any way we can get the compiler to infer IThing<int> ?
        var thing = f.Create("one");

    }
}

Ответы [ 2 ]

1 голос
/ 07 июня 2011

Вопрос, кажется, здесь:

// any way we can get the compiler to infer IThing<int> ?
var thing = f.Create("one");

Нет.Вам нужно было бы явно указать тип:

var thing = f.Create<int>("one");

Невозможно вывести тип возвращаемого значения без использования параметра, специально используемого в методе.Компилятор использует параметры, переданные методу, для вывода типа T, и в этом случае это однострочный параметр без параметров типа T.Таким образом, нет никакого способа сделать это для вас.

0 голосов
/ 07 июня 2011

Нет, вы не можете сделать это, потому что результат вашего Create фабричного метода будет оцениваться во время выполнения на основе значения параметра. Generics предназначены для безопасности во время компиляции, и в вашем случае вы не можете иметь такую ​​безопасность, потому что значение параметра будет известно только во время выполнения.

...