我正在尝试实现Nullable类型。但是下面提到的代码不支持valuetype数据类型的空值。
using System;
using System.Runtime;
using System.Runtime.InteropServices;
namespace Nullable
{
[Serializable, StructLayout(LayoutKind.Sequential)]
public struct Nullable<T> where T : struct
{
private bool hasValue;
public bool HasValue
{
get { return hasValue; }
}
internal T value;
public Nullable(T value)
{
this.value = value;
this.hasValue = true;
}
public T Value
{
get
{
if (!this.hasValue)
{
new InvalidOperationException("No value assigned");
}
return this.value;
}
}
public T GetValueOrDefault()
{
return this.value;
}
public T GetValueOrDefault(T defaultValue)
{
if (!this.HasValue)
{
return defaultValue;
}
return this.value;
}
public override bool Equals(object obj)
{
if (!this.HasValue)
{
return obj == null;
}
if (obj == null)
{
return false;
}
return this.value.Equals(obj);
}
public override int GetHashCode()
{
if (!this.hasValue)
{
return 0;
}
return this.value.GetHashCode();
}
public override string ToString()
{
if (!this.hasValue)
{
return string.Empty;
}
return this.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;
}
}
}
当我尝试将值赋值为null时,它会抛出一个错误“无法将null转换为'Nullable.Nullable',因为它是一个不可为空的值类型”
我需要做些什么来解决这个问题?
答案 0 :(得分:5)
将null
分配给Nullable<T>
只是分配new Nullable<T>()
的语法糖,它是C#语言的一部分,您无法将该功能添加到自定义类型。
C#规范,
4.1.10可空类型
可空类型可以表示其基础类型的所有值加上 一个额外的空值。可空类型写为T ?,其中T为 基础类型。此语法是System.Nullable的简写, 这两种形式可以互换使用。
6.1.5空文字转换
存在从null文字到任何可空的隐式转换 类型。此转换生成给定的空值(第4.1.10节) 可空类型。
答案 1 :(得分:1)
你不能。
Nullable<T>
是一个特例。它在CLR级别上有特殊处理(这不是纯粹的C#语言特性 - 特别是CLR支持装箱/拆箱无效的特殊场景)。
答案 2 :(得分:0)
您将自己开发的Nullable声明为struct
,而struct
不可为空。
您应该将其声明为class
。
此代码应该抛出您遇到的相同错误,
将Point类型声明从struct
切换到class
应修复它。
void Main()
{
Point p = null;
}
// Define other methods and classes here
struct Point
{
public int X {get; set;}
public int Y {get; set;}
}