首页 新闻 会员 周边

为什么同样是泛型结构,我的却不能为null???

0
悬赏园豆:10 [已解决问题] 解决于 2010-04-06 09:34
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication24
{
public struct kong<T> where T : struct
{
T value;
}
class Program
{
static void Main(string[] args)
{
System.Nullable
<int> i1 =new Nullable<int>();
i1
= null;
kong
<int> bb = new kong<int>();
bb
= null;//错误 1 无法将 Null 转换成“ConsoleApplication24.kong<int>”,因为它是一种不可为 null 值的类型

}
}
}

为什么fcl中的泛型结构可以为null,我的自定义的却不能为null???

ForFreeDom的主页 ForFreeDom | 小虾三级 | 园豆:589
提问于:2010-04-05 11:48
< >
分享
最佳答案
1

值类型是不能为空的,可空类型 如:int? 其实是Nullable<T>

可能fcl中的定义是Nullable<T> 的格式定义的

收获园豆:10
LittlePeng | 老鸟四级 |园豆:3445 | 2010-04-05 14:32
为什么fcl中的泛型结构可以为null,我的自定义的却不能为null???
ForFreeDom | 园豆:589 (小虾三级) | 2010-04-05 14:38
using System.Runtime.CompilerServices; namespace System { [Serializable] public struct Nullable<T> where T : struct { public Nullable(T value); public static explicit operator T(T? value); public static implicit operator T?(T value); public bool HasValue { get; } public T Value { get; } public override int GetHashCode(); public T GetValueOrDefault(); public T GetValueOrDefault(T defaultValue); public override string ToString(); } }
ForFreeDom | 园豆:589 (小虾三级) | 2010-04-05 14:41
@ForFreeDom: 是有些诡异,不过呢可以这样理解:fcl里面不是只有Nullable<T> 这一个可空的struct吗?它使得值类型可以为null。Nullable<T>是.net的特殊处理吧,如struct 不还是继承自valuetype类啊。它是编译器和clr的特殊化吧~~,我想如果可以从他的il层次去看就是可以理解了,而我们自己的struct是无法为null(无论如何无法通过编译的),要不就用Nullable<T> ,可以定义成:Nullable<MyStruct<T>>这样啊,没有必要一定要自己为空吧。
LittlePeng | 园豆:3445 (老鸟四级) | 2010-04-05 21:30
就是Nullable<MyStruct<T>>了
LittlePeng | 园豆:3445 (老鸟四级) | 2010-04-05 21:31
Nullable<T>可是语言层面支持的东西,而且Nullable<T>是一个class而不是struct吧?
Gray Zhang | 园豆:17610 (专家六级) | 2010-04-13 00:17
@Gray Zhang:肯定是个结构呀,看一下元数据就知道了
ForFreeDom | 园豆:589 (小虾三级) | 2010-07-03 22:32
其他回答(3)
1

因为你定义成了struct,struct是不能为null的,如果需要为null,定义成class即可

Gray Zhang | 园豆:17610 (专家六级) | 2010-04-05 13:50
为什么fcl中的泛型结构可以为null,我的自定义的却不能为null???
支持(0) 反对(0) ForFreeDom | 园豆:589 (小虾三级) | 2010-04-05 14:38
using System.Runtime.CompilerServices; namespace System { [Serializable] public struct Nullable<T> where T : struct { public Nullable(T value); public static explicit operator T(T? value); public static implicit operator T?(T value); public bool HasValue { get; } public T Value { get; } public override int GetHashCode(); public T GetValueOrDefault(); public T GetValueOrDefault(T defaultValue); public override string ToString(); } }
支持(0) 反对(0) ForFreeDom | 园豆:589 (小虾三级) | 2010-04-05 14:41
1

值类型不能为null,除非是可空类型,例如:int?,struct类型为值类型;

独角戏-klx | 园豆:253 (菜鸟二级) | 2010-04-05 15:44
struct类型为值类型,那么你有没有看一下System.Nullable<T> 的元数据,它本身也是stuct类型,那为什么能为空呢???
支持(0) 反对(0) ForFreeDom | 园豆:589 (小虾三级) | 2010-04-05 16:20
@ForFreeDom: kong<int>? bb = new kong<int>(); bb = null; 这样写就可以了,不知道满意不?
支持(0) 反对(0) 独角戏-klx | 园豆:253 (菜鸟二级) | 2010-04-05 20:55
0

以上两人都是正解。我就不重复了。    ·

josephsyj | 园豆:210 (菜鸟二级) | 2010-04-05 21:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册