C# “如何返回”;空";而不是泛型类型(类)的虚拟实例?

C# “如何返回”;空";而不是泛型类型(类)的虚拟实例?,c#,unity3d,C#,Unity3d,我有一个自定义的SerializableDictionary,在那里我可以为键和值放置任何结构或类。我的问题是,当我返回键或值为类时的“default”时,我会得到一个具有默认属性的伪实例,而不是null 我希望在“default”来自一个类类型时返回null,或者定义每个类类型,对于它,“default”表示null 我知道结构的可空修复,但这要求我指定类型为“where key/value is struct”,并且它会阻止类类型的使用 有人需要帮忙吗? 附言:搜索“//问题就在这里!” [

我有一个自定义的SerializableDictionary,在那里我可以为键和值放置任何结构或类。我的问题是,当我返回键或值为类时的“default”时,我会得到一个具有默认属性的伪实例,而不是null

我希望在“default”来自一个类类型时返回null,或者定义每个类类型,对于它,“default”表示null

我知道结构的可空修复,但这要求我指定类型为“where key/value is struct”,并且它会阻止类类型的使用

有人需要帮忙吗? 附言:搜索“//问题就在这里!”

[可序列化]
公共类SerializableDictionary:ISerializableDictionary
{
[序列化字段]
受保护的列表键=新列表();
[序列化字段]
受保护列表值=新列表();
public void CloneFrom(SerializableDictionary源)
{
keys=source.keys.Clone();
values=source.values.Clone();
}
公共SerializableDictionary克隆()
{
SerializableDictionary结果=新建SerializableDictionary();
结果。克隆自(此);
返回结果;
}
公共无效设置值(TKeyType键,TValueType值)
{
int index=keys.IndexOf(key);
如果(索引!=-1)
{
数值[指数]=数值;
}
其他的
{
key.Add(key);
增加(价值);
}
}
公共bool hasValue(TValueType值)=>values.Contains(值);
public bool hasEntry(TKeyType key)=>keys.Contains(key);
公共无效删除(TValueType值)
{
int index=值。IndexOf(值);
如果(索引==-1)
{
返回;
}
键。移除(索引);
移除值(索引);
}
公共无效删除(TKeyType密钥)
{
int index=keys.IndexOf(key);
如果(索引==-1)
{
返回;
}
键。移除(索引);
移除值(索引);
}
//问题就在这里!
公共TValueType getValueFromKey(TKeyType键)
{
int index=keys.IndexOf(key);
返回索引!=-1?值[索引]:默认值;
}
//问题就在这里!
public TKeyType getKeyFromValue(TValueType值)
{
int index=值。IndexOf(值);
返回索引!=-1?键[索引]:默认值;
}
公共列表GetValues()
{
返回值。ToList();
}
公共列表GetKeys()
{
返回键。ToList();
}
public SerializableDictionary filterByType(),其中TFilter:TValueType
{
SerializableDictionary结果=新建SerializableDictionary();
for(int index=0;indexkeys.Count;
//公共对象当前=>抛出新的NotImplementedException();
公共空间清除()
{
键。清除();
value.Clear();
}
[过时]
公共字符串GetFieldAsString(int迭代器)
{

return Count我无法复制它。我用字符串作为值测试了代码,反序列化后,这些值会被保留下来:

var dict = new SerializableDictionary<int, string>();
dict.SetValue(1, default);
dict.SetValue(2, "");
dict.SetValue(3, "Andromeda");
var binaryFormatter = new BinaryFormatter();
var stream = new MemoryStream();
binaryFormatter.Serialize(stream, dict);
stream.Position = 0;
dict = (SerializableDictionary<int, string>)binaryFormatter.Deserialize(stream);
foreach (var key in dict.GetKeys())
{
    var value = dict.getValueFromKey(key);
    Console.Write($"Key: {key}, Value: ");
    if (value == null)
    {
        Console.WriteLine("null");
    }
    else if (value == String.Empty)
    {
        Console.WriteLine("String.Empty");
    }
    else
    {
        Console.WriteLine($"\"{value}\"");
    }
}
备注:对于要编译的类
SerializableDictionary
,我必须注释掉以下代码行

//: ISerializableDictionary
//[SerializeField]
//[SerializeField]
//keys = source.keys.Clone();
//values = source.values.Clone();

你是说类的
default
为你提供了一个实例,而不是
null
?Yes Lasse:/我假设是因为类类型是可序列化的。你是在序列化/反序列化它吗?你能提供一个调用代码的示例,其中你得到的是一个伪实例而不是null吗?我从未使用过default;你尝试过default吗(tValue类型);?尝试一个序列化的类,并将其用于键或值。int和string这两个原语不是我的用例。@Discipol我建议您向我们展示您的用例,提供一个可复制的示例,我们可以复制粘贴和编译,而不是徒劳地尝试通过反复尝试来复制它。请帮助我们,以便我们能够p你!Pfff,我试过了!正如你所看到的,有一些额外的东西我必须从这个大项目中分离出来。部分“修复”是做一个tryGet而不是get,如果我返回“false”,那么我使用“null”而不是默认的虚拟对象。谢谢您的尝试。@Discipol那么问题应该隐藏在您忽略的额外内容的某个地方,因为您的类按原样工作正常!作为旁注,您应该看看。类的公共成员,尤其是方法,应该使用PascalCasing大写。请使用camelCasing作为loc仅限al变量、方法参数和专用字段。
Key: 1, Value: null
Key: 2, Value: String.Empty
Key: 3, Value: "Andromeda"
//: ISerializableDictionary
//[SerializeField]
//[SerializeField]
//keys = source.keys.Clone();
//values = source.values.Clone();