【发布时间】:2016-08-31 07:34:28
【问题描述】:
假设我有一个通用的class 有一个约束,其中T 必须实现IWatchable<TKey>,有没有什么方法可以使用Watcher 而不必显式声明TKey 类型,考虑到@ 987654326@ 会提供那个吗?
public class Watcher<T, TKey> where T : IWatchable<TKey>
{
}
public interface IWatchable<TKey>
{
TKey Key { get; }
}
如果我想使用 Watcher class 我必须将 TKey 声明为第二种类型。
var watcher = new Watcher<BeingWatched, int>();
public class BeingWatched : IWatchable<int> { ... }
或者
var watcher = new Watcher<AlsoBeingWatched<Guid>, Guid>();
public class AlsoBeingWatched<TKey> : IWatchable<TKey> { ... }
【问题讨论】:
-
考虑类型系统将允许一个类型实现一个泛型接口多次次(使用不同的类型参数)。
-
@Damien_The_Unbeliever 所以如果
BeingWatched实现了IWatchable<int>和IWatchable<Guid>那么Watcher将不知道在BeingWatched中使用哪个实现?这就是为什么它需要明确。 -
where子句仅用于约束检查 不用于类型解析...但是,您是否还需要知道Watcher上的T?也许将观察者注册为public class Watcher<TKey>并使用IWatchable而不是具体类型就足够了?
标签: c# generics generic-constraints