查看此代码段
public interface IExample<T>
{
IExample<T> Exposes<TInclude>()
where T : TInclude;
}
我希望编译时间强制执行T可以转换为TInclude。可以进行运行时检查,但希望它是编译时间。
以上抱怨T未定义。
有什么建议吗?我正在尝试用C#generics做什么?
答案 0 :(得分:5)
改述你的问题:
可以制作一个
where
子句来强制执行TInclude
为T
的约束或从T
派生的任何类型。我希望强制执行“相反方向”约束:TInclude
是T
或T
的任何“基本类型”。这可能吗?
没有。 C#不支持这种约束。遗憾。
有什么建议吗?
Scala支持我认为的那种约束。和Java一样,尽管Java的做法有点奇怪。但我想你不想改变语言。
您能否更详细地描述您希望通过此界面表示的概念?如果我们知道你要做什么,那么给你提供实用的建议会更容易。
答案 1 :(得分:1)
您可以将类型约束移动到接口级别,如:
public interface IExample<T, U>
where T : U
{
IExample<T, U> Exposes();
}
答案 2 :(得分:0)
有一天可以实施:见1.2 Generalized Constraints