【发布时间】:2010-02-26 22:00:26
【问题描述】:
我想为泛型类 A 创建一个扩展方法,它采用另一个泛型类型(在本例中为 TC),但我想这不可能吗?
class Program
{
static void Main(string[] args)
{
var a = new A<B, B>();
a.DoIt<B>();
}
}
static class Ext
{
public static A<TA, TB> DoIt<TA, TB, TC>(this A<TA, TB> a)
{
return a;
}
}
class A<TA, TB> { }
class B { }
【问题讨论】:
-
一个有趣的想法,我们不支持。本质上,这将是对泛型方法的泛型类型参数“部分评估”的一种形式;通常是对方法的形式参数进行柯里化和部分评估。当然有些语言可以轻松地对形式进行部分评估,但是有人知道是否有语言(函数式或其他语言)允许对泛型类型参数进行部分评估吗?那会很整洁。
-
@Eric - 这就是 F# 的扩展方法的工作原理。此外,F# 允许您将
_用于您不想指定且可以推断的类型参数,因此即使在非扩展方法调用中,您也可以使用Foo<_,_,TypeICareAbout>(...)而不是Foo<LongTypeName,AnotherInferableType,TypeICareAbout>(...),这通常是可读性的一大胜利。另一方面,F# 不允许封闭泛型类型上的扩展成员,这是 C# 的一个很好的特性。 -
@kvb:很酷,感谢您的留言。自 1993 年以来,我实际上还没有用任何 ML 变体编写过程序,所以我有点生疏了。我真的应该用 F# 编写一些程序,看看它是如何工作的。
标签: c# generics type-inference