Использование анонимных универсальных типов с несколькими универсальными - PullRequest
2 голосов
/ 24 июня 2010

После просмотра этого блога Кириллом Осенковым (Как создать общий список анонимных типов?) Я пытаюсь сделать что-то более продвинутое и у меня возникают проблемы.

Следующеекод компилируется:

    var anon = new { One = "1", Two = "2" };
    var result = DoSomething(anon);

    public static T DoSomething<T>(T value)
    {
        return value;
    }

Но если я попытаюсь добавить дополнительный универсальный тип, я не смогу его скомпилировать:

    var anon = new { One = "1", Two = "2" };
    var result = DoSomethingElse<int>(anon);

    public static T2 DoSomethingElse<T, T2>(T value)
        where T2 : new()
    {
        return new T2();
    }

Поскольку у меня нет способа указать, что T является typeof(скоро), я не могу заставить его сделать вывод, когда мне дан тип для T2.Это возможно?

Ответы [ 2 ]

2 голосов
/ 24 июня 2010

Нет.Этот тип функции не поддерживается компилятором C #.Вы должны либо вручную указать все общие параметры, либо ни одного и полагаться на вывод типа.

Ближайшее, что вы получите, это

var anon = new { One = "1", Two = "2" };
var result = DoSomethingElse(anon,42);

public static T2 DoSomethingElse<T, T2>(T value, T2 otherValue)
    where T2 : new()
{
    return new T2();
}
0 голосов
/ 24 июня 2010

Не совсем удовлетворительный ответ, но вы могли бы сделать следующее, если вы можете допустить написание другой версии DoSomethingWithT2 для каждого типа T2:

var anon = new { One = "1", Two = "2" };
var result = DoSomethingWithInt(anon);

public static int DoSomethingWithInt<T>(T value)
{
    return DoSomethingElse<T, int>(value);
}

public static T2 DoSomethingElse<T, T2>(T value) where T2 : new()
{
    return new T2();
}

Правильный ответ -просто чтобы прекратить использовать анонимный тип здесь и использовать кортеж или определить свой собственный тип.К сожалению.

...