2013-03-12 67 views
0

看看这个片断接口<T>方法<T2>其中T2:T

public interface IExample<T> 
{ 
    IExample<T> Exposes<TInclude>() 
     where T : TInclude; 
} 

我期待编译时强制执行T是强制转换为TInclude。可以做一个运行时检查,但宁愿它是编译时间。

以上抱怨T未定义。

有什么建议吗?我试图用C#泛型来做什么?

+1

我编辑了您的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 – 2013-03-12 19:43:20

+2

你得到了这个倒退。我担心你不能做静态的问题。 – 2013-03-12 19:44:01

+4

可能有'TInclude:T',但不能'T:TInclude'。 – dtb 2013-03-12 19:44:04

回答

5

改写你的问题:

它有可能使一个where条款,强制的约束TIncludeT或衍生自T的任何类型。我正在寻求强制执行“反向”约束:TIncludeT或任何“基本类型”T。这可能吗?

编号C#不支持这种约束。抱歉。

有什么建议吗?

斯卡拉支持我认为的那种约束。与Java一样,尽管Java的做法有点奇怪。但是我想你不想改变语言。

你能更详细地描述一下你真正想用这个接口表示的概念吗?如果我们知道你在做什么,那么给你实际的建议会更容易。

+0

这个答案更直接地解决了我的意图。 – 2013-03-12 21:46:10

+0

我要去我认为编译时间的安全性很好,但不是那么重要,基本上,我们正在构建的系统特别“暴露”某些类作为他们实现的接口,还有很多需要解释的东西,所以TContract是一个可以由T实现的接口,并且我想在编译时捕获任何错误。 – 2013-03-12 21:47:19

+0

@JoshuaEvensen:我不知道.Net代码合同是否可以将这些运行时检查转化为编译时检查 – Brian 2013-03-13 13:41:35

1

您可以将类型约束移动到界面的水平,这样的:

public interface IExample<T, U> 
    where T : U 
{ 
    IExample<T, U> Exposes(); 
} 
+0

你打败了我。 ;-( – 2013-03-12 19:55:06

+3

要扩大Marcin的解决方案,泛型类型的约束必须在声明泛型的东西 - 在这种情况下是接口,而不是方法。 – 2013-03-12 20:04:08

0

它可能在某一天实施:请参阅1.2 Generalized Constraints

+0

该链接无法正常工作,这就是为什么只有链接的答案令人不悦。 – 2013-03-12 20:18:40

+0

这是多页pdf,它似乎工作... – QrystaL 2013-03-12 20:24:07

+0

它似乎回来了。我收到一条消息,说“网站已关闭”。 – 2013-03-12 20:24:41

相关问题