使用支持对象/结构的泛型时如何返回空值/默认值? [复制]

Posted

技术标签:

【中文标题】使用支持对象/结构的泛型时如何返回空值/默认值? [复制]【英文标题】:How to return a null/default value when using generics that support objects/structs? [duplicate] 【发布时间】:2015-09-17 09:38:56 【问题描述】:

我正在做一些动态的人工智能。编程并避免为每个用例创建这么多不同的类,以便可以正确传递参数,我想我会使用一个对象包/容器,类似于字典。

为了支持它完全通用,我将键设置为类型参数,这样我就可以在其他项目中使用它,效果很好。我的问题是,我想支持对象和结构,所以在实现 TryGet 样式函数时,我不知道如何分配 out 参数。

这是我的课:

using System;
using System.Collections.Generic;

namespace mGuv.Collections

    public class ObjectBag<TKey>
    
        private Dictionary<Type, Dictionary<TKey, object>> _objects = new Dictionary<Type, Dictionary<TKey, object>>();

        public ObjectBag()
        
        

        private bool HasTypeContainer<T>()
        
            return _objects.ContainsKey(typeof(T));
        

        public bool HasKey<T>(TKey key)
        
            if (HasTypeContainer<T>())
            
                return _objects[typeof(T)].ContainsKey(key);
            

            return false;
        

        public void Add<TIn>(TKey key, TIn value)
        
            if(!HasTypeContainer<TIn>())
            
                _objects.Add(typeof(TIn), new Dictionary<TKey, object>());
            

            _objects[typeof(TIn)].Add(key, value);
        

        public bool TryGet<TOut>(TKey key, out TOut value)
        
            if (HasKey<TOut>(key))
            
                value = (TOut)_objects[typeof(TOut)][key];
                return true;
            

            // As expected, I can't assign value to null
            value = null; 

            // I also can't just return false as value hasn't been assigned
            return false;
        
    

是否可以为传入的任何内容的默认值赋值?

即我希望能够做到:

ObjectBag<string> myBag = new ObjectBag();
myBag.Add<int>("testInt", 123);
myBag.Add<TestClass>("testClass", new TestClass();
myBag.TryGet<int>("testInt", out someInt);
myBad.TryGet<TestClass>("testClass", out someTestClass);

我不想使用 ref,因为这需要在传入变量之前对其进行初始化。

【问题讨论】:

你可以使用default(T) @Verarind,是的,你是对的,谢谢。出于某种原因,我认为 default 仅适用于值类型。 【参考方案1】:

没关系,我以为 default 只适用于结构/值类型。

我只能这样做:

value = default(TOut);

在提出问题之前,我真的应该进行更多研究。我会留下它,以防其他人像我一样愚蠢。

【讨论】:

以上是关于使用支持对象/结构的泛型时如何返回空值/默认值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何键入使用 Array.push() 的泛型函​​数?

盘点一下面试官最爱问的泛型和包装类,建议反复观看,真的写的非常详细

Java中的泛型的问题?

JAVA中的泛型用法一种: <T> 返回值用法。

转换为协议默认方法的泛型类型

如何从 C# 中的泛型类型数组中选择一组随机值?