看看这个片段
public interface IExample<T>
{
IExample<T> Exposes<TInclude>()
where T : TInclude;
}
我希望编译时强制 T 可转换为 TInclude。可以进行运行时检查,但希望它是编译时。
上面抱怨 T 没有定义。
有什么建议么?我试图用 C# 泛型做的事情是可能的吗?
改写你的问题:
可以创建一个
where
子句来强制执行TInclude
是T
或派生自 的任何类型的约束T
。我希望强制执行“相反方向”约束:即TInclude
或T
任何“基本类型”的T
. 这可能吗?
不,C# 不支持这种约束。对不起。
有什么建议么?
Scala 支持我认为的那种约束。和 Java 一样,尽管 Java 的做法有点奇怪。但我想你不想改变语言。
你能更详细地描述你真正想用这个界面表示的概念吗?如果我们知道你想要做什么,那么给你实用的建议会更容易。
您可以将类型约束移动到接口级别,如下所示:
public interface IExample<T, U>
where T : U
{
IExample<T, U> Exposes();
}
它可能有一天会实现:见1.2 广义约束