反转通用约束

时间:2017-09-12 13:01:58

标签: c#

上周我一直在大力学习通用约束。在深入学习它们的同时,如果有可能以某种方式反转它们,我变得很好奇。与我合作的人不确定这样的事情是否存在,而且谷歌搜索也没有提出任何结果。

我得到的最接近的答案是使用struct而不是class,但是虽然我可以看到为什么这个人认为这是一个不错的答案并且适用于大多数用途,但如果有办法,它仍然无法回答反转约束。

是否有其他人知道是否可以反转约束?

e.g。

class myClass<T> where T: !class
{
}

1 个答案:

答案 0 :(得分:3)

不,C#中没有这样的语法。

来自MSDN

  

下表列出了六种类型的约束:

     

其中T:struct type参数必须是值类型。   可以指定除Nullable之外的任何值类型。请参阅使用Nullable   类型更多信息。其中T:class类型参数必须是   参考类型;这也适用于任何类,接口,委托,   或数组类型。

     

其中T:new()类型参数必须是public   无参数构造函数。与其他约束一起使用时,   必须最后指定new()约束。

     

其中T :(基类名称)类型参数必须是或来自指定的基数   类。

     

其中T :(接口名称)类型参数必须为或   实现指定的接口。多个接口约束可以   被指定。约束接口也可以是通用的。

     

其中T:U 为T提供的类型参数必须是或来自   为U提供的论据。

所以没有选择说其中T是U

以外的任何类型

以这种方式思考 - 假设你有

class myClass<T> where T: !string
{
}

您知道T不是字符串,但您没有其他T可能的指示。那么你如何编码呢?这些都是有效的延期:

var x1 = new myClass<int>();
var x2 = new myClass<object>();
var x3 = new myClass<DateTime>();
var x4 = new myClass<DataTable>();

您可以使用哪种代码适用于所有这些类型,但对string无效?