通用方法的条件编译

Jak*_*ake 6 .net c# generics

目前正在开发一个双向查找关联泛型,由TKey排序.在某些时候,我希望有如下访问权限:

public class Assoc<TKey, TValue>
{
     public TKey this[TValue value] { get; }
     public TValue this[TKey value] { get; }
}
Run Code Online (Sandbox Code Playgroud)

但显然当TKey == TValue时,这将失败.出于好奇,是否有条件编译语法来执行此操作:

public class Assoc<TKey, TValue>
{
     [Condition(!(TKey is TValue))]
     public TKey this[TValue value] { get; }

     [Condition(!(TKey is TValue))]
     public TValue this[TKey value] { get; }

     public TKey Key(TValue value) { get; }

     public TValue Value(TKey value) { get; }
}
Run Code Online (Sandbox Code Playgroud)

And*_*erd 4

不,没有基于泛型类型的条件编译。

泛型替换是在运行时而不是编译时执行的。

这是 .NET 泛型和 C++ 模板之间的区别之一。

泛型也没有C++ 模板所具有的专门化概念。

http://msdn.microsoft.com/en-us/library/c6cyy67b.aspx

  • +1。注意“泛型是在运行时解析的,而不是编译时解析的。” 并不完全正确 - 在编译时需要正确找到泛型类中的方法(这正是当编译器尝试选择需要使用哪个版本的索引器时 Jake 的类产生的错误)。 (2认同)
  • 同意@Alexei;这里的问题与泛型的运行时行为无关。这“纯粹”是方法重载解析的问题,它是一个编译时构造。特别是,问题在于,如果没有限定符(例如“where TKey: Foo”等),编译器会将它们视为“对象”,因此会出现正常的方法重载冲突行为——当两个方法共享相同的内容时参数类型(即“对象”)——开始使用。这是一个“编译”时场景。 (2认同)