C#generic*不*实现某些功能

C#generic*不*实现某些功能,c#,generics,C#,Generics,我知道我可以做出这样的方法 private T MyFun<T>() where T : IMyInterface {...} private T MyFun() 其中T:IMyInterface {...} 我可以做相反的操作吗,即T不实现IMyInterface?具体的用例是,我不想允许可空类型,但我只是对一般情况感到好奇。如果您不想要可空类型,您可以这样做 private T MyFun<T>() where T : struct {...} pr

我知道我可以做出这样的方法

private T MyFun<T>() 
  where T : IMyInterface
{...}
private T MyFun()
其中T:IMyInterface
{...}

我可以做相反的操作吗,即T不实现IMyInterface?具体的用例是,我不想允许可空类型,但我只是对一般情况感到好奇。

如果您不想要可空类型,您可以这样做

private T MyFun<T>() 
  where T : struct
{...}
private T MyFun()
其中T:struct
{...}

否,在一般情况下,您不能指定“排除列表”。但是,为了防止允许使用可为null的类型,可以使用“where T:class”约束。因为Nullable是一个结构,所以它将具有所需的效果


编辑:哎呀,看来我太仓促了-你是在问如何防止允许任何可以为null或特别是可以为null的内容吗?

你总是可以在运行时抛出一个NotSupportedException()。诚然,这不像编译器阻止它那样好,让我们假设出于假设的目的,他想阻止使用
null
。使用约束
T:class
,您排除了所有结构,而不仅仅是
Nullable
。True-如上所述,没有“排除列表”约束。这是我所知道的唯一排除Nullable的方法,有了泛型约束。诚然,这并不理想——正如你所注意到的!有趣的是,
where T:struct
约束也排除了
Nullable
。因此,如果OP确实知道他/她只需要值类型或引用类型,那么其中一种就可以了。我的问题是关于nullables的,但我对一般性陈述更感好奇。这个问题的答案听起来像是,你不能排除一些。即使你可以排除一个特定的接口(或基类型),你会如何使用它来排除任何
t
Nullable
?即使使用此功能,您也无法做到这一点。