【问题标题】:The type must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'System.Nullable<T>'该类型必须是不可为空的值类型,才能将其用作泛型类型或方法“System.Nullable<T>”中的参数“T”
【发布时间】:2018-03-04 04:14:24
【问题描述】:

我创建了一个泛型类:

public class Pair<L, R>
{
    public L? left;
    public R? right;
    // some code
}

我想为泛型类型使用可空变量。编译器报错:

该类型必须是不可为空的值类型才能将其用作 泛型类型或方法“System.Nullable”中的参数“T”

在这种情况下,克服这个错误的正确结构应该是什么?谢谢。

【问题讨论】:

  • 您希望仅对此类使用值类型还是同时使用值类型和引用类型?
  • 旁注:不要使用公共字段,将它们设为属性。并且一定要阅读不可变的,你的 Pair 应该是这样设计的。
  • 当然,我使用字段。最初,它们是私人的。我在这里公开公众只是为了削减代码并尽可能简洁地说明问题。解决方案不取决于它们是私有的还是公共的。

标签: c#


【解决方案1】:

您可以将它们限制为值类型:

 public class Pair<L, R>  
     where L: struct
     where R: struct

但这不允许引用类型(类),不清楚这是否是您想要的。
当 L 和 R 是引用类型时,您不需要 ?

编写一个同时允许两者的通用 Pair 要困难得多。我不确定是否可以直接完成。也许在 C# 8 中。

否则,您需要对成员进行一些包装。

【讨论】:

  • 感谢您的回复。它也适用于不是结构的原始类型吗?如果我对复杂类型有限制,我可以在内部只做空检查。但我想将它与模板类型普遍使用,这些模板类型本身不能为空。例如,bool、int 等。
  • 正确的语法是public class Pair&lt;L, R&gt; where L : struct where R: struct,第一个'struct'后面没有逗号。奇怪但真实。
  • @BorisZinchenko:原始类型结构。
  • @Jon Skeet,非常感谢您的澄清。我会尝试编译,然后将其标记为答案。
  • @BorisZinchenko:如果你想表达一个值可能会丢失,并且随意使用值类型和引用类型,你将不得不使用选项类型。有几种实现可用于 C#;请搜索并探索哪一种适合您的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多