【问题标题】:Call generic Method with multiple generic Types without specifying every single generic Type调用具有多个泛型类型的泛型方法而不指定每个泛型类型
【发布时间】:2015-12-28 10:40:05
【问题描述】:

所以我有一个具有多种泛型类型的泛型方法。

现在我想以这种方式调用此方法(使用 a 和 b 的类型并仅指定返回类型):

class Example
{

    T1 GenericMethod<T1, T2, T3>(T2 parameter1, T3 parameter2)

    {
        T1 returnValue = default(T1);

        // ... Do something with returnType, parameter1 and parameter2

        return returnValue;
    }

    void AccessGenericMethod()
    {
        var a = new Foo1();
        var b = new Foo2();
        var result = GenericMethod<ReturnType>(a, b); // doesn't work
    }
}

我想避免这样打电话给GenericMethod

var result GenericMethod<ReturnType, Foo1, Foo2>(a, b);

【问题讨论】:

标签: c# generics methods call


【解决方案1】:

在 C# 中,没有部分类型推断:您必须指定所有泛型参数或不指定任何泛型参数,但后者仅在编译器能够从上下文推断所有类型时才有效。无法推断返回类型(除了一些特殊情况,例如 lambdas),因此您想要做的事情是不可能的。

两种解决方法:

A:将T1从方法移动到类

class Example<T1>
{
    T1 GenericMethod<T2, T3>(T2 parameter1, T3 parameter2)

B:将T2T3 替换为object

class Example
{
    T1 GenericMethod<T1>(object parameter1, object parameter2)

【讨论】:

  • @Sebastian,你能举一个编译器无法推断所有类型的例子吗?问题中的示例var result = GenericMethod&lt;ReturnType&gt;(a, b) 似乎是编译器应该能够推断的。参数的声明类型为已知类型,返回类型在方法调用中明确指定。
  • @HotN 应该,是的,也许。但是 C# 并不是这样设计的。这根本不是 C# 开发人员实现的功能。
  • 好的,我只是希望他们在未来的 C# 版本中这样做,并接受在此之前只需要编写一些额外的代码。谢谢!
【解决方案2】:

我找到了解决办法

class Example
{
    T1 GenericMethod<T1, T2, T3>(T2 parameter1, T3 parameter2, out T1 returnValue)
    {
        returnValue = default(T1);

        // ... Do something with returnType, parameter1 and parameter2

        return returnValue = new T1();
    }

    void AccessGenericMethod()
    {
        var a = new Foo1();
        var b = new Foo2();
        GenericMethod(a, b, out ReturnType result1); // work!
        ReturnType result2 = GenericMethod(a, b, out result2);
    }
}

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2016-12-24
    • 1970-01-01
    相关资源
    最近更新 更多