This question already has answers here:
How is the boxing/unboxing behavior of Nullable<T> possible?
(3 个回答)
6年前关闭。
为什么
但是自定义
测试代码如下,编译错误
(3 个回答)
6年前关闭。
为什么
null
可以像这样隐式转换为 System.Nullable<T>
:int? val = null;
但是自定义
Nullable<T>
(从 .net 引用源修改)不能分配 null
,是否有一些编译器魔法?谁能告诉我更多的内部实现?[Serializable]
public struct Nullable<T> where T : struct
{
private bool hasValue;
internal T value;
public Nullable(T value)
{
this.value = value;
this.hasValue = true;
}
public bool HasValue
{
get
{
return hasValue;
}
}
public T Value
{
get
{
if (!HasValue)
{
throw new Exception();
}
return value;
}
}
public T GetValueOrDefault()
{
return value;
}
public T GetValueOrDefault(T defaultValue)
{
return HasValue ? value : defaultValue;
}
public override bool Equals(object other)
{
if (!HasValue) return other == null;
if (other == null) return false;
return value.Equals(other);
}
public override int GetHashCode()
{
return HasValue ? value.GetHashCode() : 0;
}
public override string ToString()
{
return HasValue ? value.ToString() : "";
}
public static implicit operator Nullable<T>(T value)
{
return new Nullable<T>(value);
}
public static explicit operator T(Nullable<T> value)
{
return value.Value;
}
}
测试代码如下,编译错误
Nullable<int> x = null; //ERROR Cannot convert null to 'Nullable<int>' because it is a non-nullable value type
最佳答案
C# 5.0 规范的第 6.1.5 节:
请注意,此编译器提供的隐式转换仅存在于可空类型。您自定义的 Nullable<T>
不是 C# 规范定义的可空类型。这只是您声明的一些结构,它具有内置 Nullable<T>
类型的许多功能(在引用的第 4.1.10 节中进行了描述),但实际上根据 C# 中的定义,它并不是“可为空的”。
关于c# - 为什么c#null可以隐式转换为System.Nullable<T>,而不能自定义Nullable<T>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29574048/
10-12 23:43