看看这个片断接口<T>方法<T2>其中T2:T
public interface IExample<T>
{
IExample<T> Exposes<TInclude>()
where T : TInclude;
}
我期待编译时强制执行T是强制转换为TInclude。可以做一个运行时检查,但宁愿它是编译时间。
以上抱怨T未定义。
有什么建议吗?我试图用C#泛型来做什么?
看看这个片断接口<T>方法<T2>其中T2:T
public interface IExample<T>
{
IExample<T> Exposes<TInclude>()
where T : TInclude;
}
我期待编译时强制执行T是强制转换为TInclude。可以做一个运行时检查,但宁愿它是编译时间。
以上抱怨T未定义。
有什么建议吗?我试图用C#泛型来做什么?
改写你的问题:
它有可能使一个
where
条款,强制的约束TInclude
是T
或衍生自T
的任何类型。我正在寻求强制执行“反向”约束:TInclude
是T
或任何“基本类型”T
。这可能吗?
编号C#不支持这种约束。抱歉。
有什么建议吗?
斯卡拉支持我认为的那种约束。与Java一样,尽管Java的做法有点奇怪。但是我想你不想改变语言。
你能更详细地描述一下你真正想用这个接口表示的概念吗?如果我们知道你在做什么,那么给你实际的建议会更容易。
这个答案更直接地解决了我的意图。 – 2013-03-12 21:46:10
我要去我认为编译时间的安全性很好,但不是那么重要,基本上,我们正在构建的系统特别“暴露”某些类作为他们实现的接口,还有很多需要解释的东西,所以TContract是一个可以由T实现的接口,并且我想在编译时捕获任何错误。 – 2013-03-12 21:47:19
@JoshuaEvensen:我不知道.Net代码合同是否可以将这些运行时检查转化为编译时检查 – Brian 2013-03-13 13:41:35
您可以将类型约束移动到界面的水平,这样的:
public interface IExample<T, U>
where T : U
{
IExample<T, U> Exposes();
}
你打败了我。 ;-( – 2013-03-12 19:55:06
要扩大Marcin的解决方案,泛型类型的约束必须在声明泛型的东西 - 在这种情况下是接口,而不是方法。 – 2013-03-12 20:04:08
它可能在某一天实施:请参阅1.2 Generalized Constraints
该链接无法正常工作,这就是为什么只有链接的答案令人不悦。 – 2013-03-12 20:18:40
这是多页pdf,它似乎工作... – QrystaL 2013-03-12 20:24:07
它似乎回来了。我收到一条消息,说“网站已关闭”。 – 2013-03-12 20:24:41
我编辑了您的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 – 2013-03-12 19:43:20
你得到了这个倒退。我担心你不能做静态的问题。 – 2013-03-12 19:44:01
可能有'TInclude:T',但不能'T:TInclude'。 – dtb 2013-03-12 19:44:04