Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Nullable<;T>;作为泛型约束的引用类型不匹配_C#_Generics_Nullable_Reference Type_Generic Constraints - Fatal编程技术网

C# 为什么Nullable<;T>;作为泛型约束的引用类型不匹配

C# 为什么Nullable<;T>;作为泛型约束的引用类型不匹配,c#,generics,nullable,reference-type,generic-constraints,C#,Generics,Nullable,Reference Type,Generic Constraints,可能重复: 我遇到了一个关于泛型类型约束的非常奇怪的事情。我有一门课是这样的: public SomeClass<T> where T:class { } public SomeClass,其中T:class { } 但是,我发现我不能像预期的那样使用可空类型: new SomeClass<int?>(); newsomeclass(); 我得到一个错误,int?必须是引用类型。Nullable真的只是一个带有语法糖的结构,使它看起来像一个引用类型吗?Nulla

可能重复:

我遇到了一个关于泛型类型约束的非常奇怪的事情。我有一门课是这样的:

public SomeClass<T> where T:class
{
}
public SomeClass,其中T:class
{
}
但是,我发现我不能像预期的那样使用可空类型:

new SomeClass<int?>();
newsomeclass();
我得到一个错误,
int?
必须是引用类型。Nullable真的只是一个带有语法糖的结构,使它看起来像一个引用类型吗?

Nullable
是一个
struct
(请参见)但是它是唯一不满足
struct
约束的
struct
。因此,当使用
结构
约束时,不能将
可空
用作泛型类型参数


Nullable
不仅仅是一个带有一些语法糖的结构。它在CLR中对某些行为有特殊的支持。例如,它有特殊的拳击行为。具体地说,可为null的对象从不装箱。基础值已装箱。如果nullable是null值(HasValue为false),则将其转换为null引用。此外,任何
Nullable
Nullable
的转换运算符都从
T
U
的转换中取消。这些是您自己无法在.NET 1.0/1.1中实现的功能。

产生这种限制的原因是什么?你能提供更多的上下文吗?FYI Nullable被声明为:
public struct Nullable,其中T:struct
@SimonWhitehead基本上是因为在这个类上使用值类型可能会有意外的行为和巨大的性能影响,因此我猜直接的答案是“是的,Nullable是一个struct”。我不太清楚你认为什么是空糖的句法糖。看来你唯一的选择就是自己滚。@SimonWhitehead你能做到
int吗?x=null
,但不能对任何其他值类型执行此操作。。所以我需要一个类似于
的限制,其中T:class,T:Nullable
,但这似乎不起作用,
null
和任何
Nullable
值之间存在一个隐式转换。它实际上并不存储null,它只是有一个布尔值
HasValue
,将null赋给它会导致该值为false,而实际的
Value
属性是…任何东西。这意味着将一个值放入一个可为null的结构实际上并不会将其装箱或导致它获得引用语义。这确实需要特殊的编译器支持,因为无法为结构从
null
进行隐式转换的自定义类型,同时也不允许使用它转换任何实际对象。