C# 接口<;T>;方法<;T2>;式中T2:T

C# 接口<;T>;方法<;T2>;式中T2:T,c#,.net,generics,C#,.net,Generics,查看这个片段 public interface IExample<T> { IExample<T> Exposes<TInclude>() where T : TInclude; } 公共接口示例 { IExample Exposes() 其中T:T包括; } 我希望在编译时强制执行T是可转换为TInclude的。可以进行运行时检查,但希望是编译时检查 上面的抱怨是T没有定义 有什么建议吗?我试图用C#泛型做的事情可能吗?您可以将

查看这个片段

public interface IExample<T>
{
    IExample<T> Exposes<TInclude>() 
        where T : TInclude;
}
公共接口示例
{
IExample Exposes()
其中T:T包括;
}
我希望在编译时强制执行T是可转换为TInclude的。可以进行运行时检查,但希望是编译时检查

上面的抱怨是T没有定义


有什么建议吗?我试图用C#泛型做的事情可能吗?

您可以将类型约束移动到接口级别,如下所示:

public interface IExample<T, U>
    where T : U
{
    IExample<T, U> Exposes();
}
公共接口示例
T:U在哪里
{
例如Exposes();
}

您可以将类型约束移动到接口级别,如下所示:

public interface IExample<T, U>
    where T : U
{
    IExample<T, U> Exposes();
}
公共接口示例
T:U在哪里
{
例如Exposes();
}

重新表述您的问题:

可以创建一个
where
子句来强制约束
T包含
T
或从
T
派生的任何类型。我希望强制执行“反向”约束:
TInclude
T
T
的任何“基本类型”。这可能吗

不,C#不支持这种约束。对不起

有什么建议吗

我认为Scala支持这种约束。Java也是如此,尽管Java的方式有点奇怪。但我想你不想改变语言


您能否更详细地描述您实际希望用此接口表示的概念?如果我们知道你想做什么,那么就更容易给你务实的建议。

重新表述你的问题:

可以创建一个
where
子句来强制约束
T包含
T
或从
T
派生的任何类型。我希望强制执行“反向”约束:
TInclude
T
T
的任何“基本类型”。这可能吗

不,C#不支持这种约束。对不起

有什么建议吗

我认为Scala支持这种约束。Java也是如此,尽管Java的方式有点奇怪。但我想你不想改变语言



您能否更详细地描述您实际希望用此接口表示的概念?如果我们知道你想做什么,那么给你一些实用的建议就容易多了。

有一天可能会实施:请看

有一天可能会实施:请看

我编辑了你的标题。请看,“,其中的共识是“不,他们不应该”。你把这个倒过来了。恐怕您不能静态地执行您所要求的操作。可以使用
t包括:t
,但不能使用
t:t包括
。您想用通用接口做什么?Expose应该返回什么?TInclude应该在哪里使用?我认为
IExample Exposes()应该可以改为。@DanielA.White是的,我就是这么想的。我已经编辑了你的标题。请看,“,其中的共识是“不,他们不应该”。你把这个倒过来了。恐怕您不能静态地执行您所要求的操作。可以使用
t包括:t
,但不能使用
t:t包括
。您想用通用接口做什么?Expose应该返回什么?TInclude应该在哪里使用?我认为
IExample Exposes()应该起作用。@DanielA.White是的,这就是我的想法。要扩展Marcin的解决方案,泛型类型约束必须位于声明泛型的对象上——在本例中是接口,而不是方法。要扩展Marcin的解决方案,泛型类型约束必须在声明泛型的东西上——在本例中是接口,而不是方法。该链接不起作用,这就是为什么只链接的答案不受欢迎的原因。它似乎又回来了。我收到一条消息说“站点关闭”。这个链接不起作用,这就是为什么只提供链接的答案不受欢迎的原因。它似乎又回来了。我收到一条消息说“站点关闭”。我想我将进行运行时检查。编译时的安全性很好,但我想不是很重要。基本上,我们正在构建的系统是专门“公开”某些类作为它们实现的接口。有很多要解释的。所以TContract是一个可以由T实现的接口,我想在编译时捕获任何错误。@JoshuaEvensen:我想知道.Net代码契约是否可以将这些运行时检查转换为编译时检查。@Brian你知道,听起来不错。我还没有使用代码契约。我会调查的。谢谢你的提醒。我想我要做一个运行时检查。编译时的安全性很好,但我想不是很重要。基本上,我们正在构建的系统是专门“公开”某些类作为它们实现的接口。有很多要解释的。所以TContract是一个可以由T实现的接口,我想在编译时捕获任何错误。@JoshuaEvensen:我想知道.Net代码契约是否可以将这些运行时检查转换为编译时检查。@Brian你知道,听起来不错。我还没有使用代码契约。我会调查的。谢谢你的提醒。