当前位置: 首页 > 知识库问答 >
问题:

如何约束泛型类型参数,使其仅接受C#中的可空值类型?

傅边浩
2023-03-14

where T:struct约束允许将可接受类型参数的域仅限于值类型集(与包括值和引用类型的类型超集相比),但似乎也完全禁止可空类型,尽管在现代版本的C#。

如果我想接受具有附加的空性的值类型,比如int,该怎么办 日期时间 等,同时拒绝字符串、IList等本机可为空的引用类型?可以这样定义约束吗?如果是呢?

事实上,我很好奇要学会实现两种情况:当用作参数的类型必须是值和可空的,以及当可接受的值类型被接受时,以及非可空值类型,并且我认为这些关系足够接近以解释两者,因此我将欣赏关于第二种的粗略评论。案例,并选择一个答案,包括它作为一个更好的一个(鉴于另一个不会在其他方面真的更好),如果超过一个答案将提交,我将不得不选择,但我现在真正需要的是第一种情况(总是需要一个既可为null又同时是值类型的类型),而且我还相信,考虑到第一种情况的知识,第二种情况将非常简单,更不用说,坚持把两个问题粘在一个问题上是不好的,所以我绝对会感激并接受只处理第一个问题的答案。


共有2个答案

谈炳
2023-03-14

这并不完全是您想要的,但也许您可以使用IConvertible的类型约束?作为一个接口,它是可为空的,由布尔、SByte、字节、Int16、UInt16、Int32、UInt32、Int64、UInt64、单字节、双字节、十进制、日期时间、字符和字符串实现。

class MyClass<T> where T : IConvertible
{
    //Etc
}
汪高岑
2023-03-14

你不能。Nullable

当你尝试像classx这样的东西时

U?不是有效的约束。用作约束的类型必须是接口、非密封类或类型参数

如果您需要同时接受TNullable

class X<T>  where T : struct
{
   public void R(T arg){ Console.WriteLine("Non nullable: {0}", arg);}
   public void R(Nullable<T> arg){Console.WriteLine("Nullable: {0}", arg);}
}

然后你可以调用任何一个版本:

X<int> r = new X<int>();
r.R((int?)4);
r.R(4);

在您的类型中,只处理Nullable值,您可以简单地约束到T:struct,但在类中的任何地方都使用Nullable

更多关于特定方面的讨论——C#所有可为空的和相关问题的泛型类型约束。

 类似资料:
  • 在TypeScript中,我有一个接受带有约束的泛型参数的函数: 现在,我正在尝试这样做,以便您可以选择添加另一个类型作为返回类型的一部分。但是,当我这样做时,我必须为U类型提供一个默认参数。这使得TypeScript停止推断U的值,并使用我提供的默认类型: 所以我的问题是,有没有办法让TypeScript继续从参数推断类型?我不想为U提供默认类型,我总是希望TypeScript推断该值。伪代码,

  • 泛型的类型约束 swapTwoValues(_:_:)函数和Stack类型可以用于任意类型. 但是, 有时在用于泛型函数的类型和泛型类型上, 强制其遵循特定的类型约束很有用. 类型约束指出一个类型形式参数必须继承自特定类, 或者遵循一个特定的协议、组合协议. 例如, Swift的Dictionary类型在可以用于字典中键的类型上设置了一个限制. 如字典中描述的一样,字典键的类型必须是可哈希的. 也

  • 所以我有这样的课: 现在我正在寻找一个类型约束,它允许我使用所有可以是的类型参数。这意味着所有引用类型,以及所有()类型: 应该是可能的。 使用作为类型约束只允许我使用引用类型。 附加信息:我正在编写一个pipes and filters应用程序,并希望使用引用作为传递到管道中的最后一项,这样每个过滤器都可以很好地关闭,进行清理,等等。。。

  • 我试图实现一个接受泛型参数的函数定义,只要它扩展了另一个特定的泛型类型。简言之参数A必须扩展参数B,其中A和B都是泛型的。 下面是我的示例 用法示例如下 一些封闭的班级 和函数调用 我不想在抽象类声明中定义E,因为T已经在那里定义了。 我也试着做了以下几点: 将myList定义为接受扩展T的键 将E定义为T类型(无法找到如何指定它在函数中扩展T 但它从来都不起作用。有没有办法做到这一点?我在Sta

  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 我在typescript中有以下泛型类 但是我不知道为什么得到这个错误Class'(匿名类)'不正确地扩展基类'列'。属性getValue的类型不兼容。类型'(值:数字)=