非泛型函数失败

问题描述 投票:0回答:1

我有两个版本的

Retrieve()
函数:通用和非通用。

非泛型版本转换其参数并调用泛型版本。

        public TChild Retrieve((T, T, T) coordinates)
        {
            try
            {
                return grid_.Retrieve(coordinates);
            }
            catch { }
            return default(TChild);
        }

        public object Retrieve(object coordinates)
        {
            try
            {
                (T, T, T)? valueTuple = coordinates as (T, T, T)?;
                return Retrieve(valueTuple);
            }
            catch { }
            return default(TChild);
        }

 (T, T, T)? valueTuple = coordinates as (T, T, T)?;
--- 这条线总是失败。

即,

valueTuple
在铸造操作后始终接收
null

为什么?我该如何解决它?

我正在使用 C# 4.7.1 和 Visual Studio 2017。


        [TestInitialize]
        public void Setup()
        {
            // Initialize the grid with a dimension size (arbitrary)
            grid = new SpatialObjectGrid3DWithId<MockSpatialClass, int, MockSpatialClass, int, int>(10);

            // Insert some objects with known coordinates and IDs for retrieval testing
            grid.Insert((1, 2, 3), new MockSpatialClass { ID = 1, Coordinates = (1, 2, 3) });
            grid.Insert((4, 5, 6), new MockSpatialClass { ID = 2, Coordinates = (4, 5, 6) });
            grid.Insert((7, 8, 9), new MockSpatialClass { ID = 3, Coordinates = (7, 8, 9) });
        }


[TestMethod]
        public void Retrieve_ByObjectCoordinates_ReturnsCorrectObject()
        {
            var coordinates = Tuple.Create(1, 2, 3);
            var result = (MockSpatialClass)grid.Retrieve((object)coordinates);
            Assert.IsNotNull(result);
            Assert.AreEqual(1, result.ID);
        }
public class SpatialObjectGrid3DWithId<TObj, TObjId, TChild, TChildId, T>
        where T : struct, IComparable<T>
        where TObj : class, ISpatialObject<TObj, TObjId, (T, T, T)>
        where TObjId : struct
        where TChild : class, ISpatialObject<TChild, TChildId, (T, T, T)>
        where TChildId : struct
    {
        private readonly Dictionary<TChildId, (T, T, T)> idDictionary_ = new Dictionary<TChildId, (T, T, T)>();
        private readonly SpatialHashGridWithMinMaxBounds3D<TChild, T> grid_;

        public SpatialObjectGrid3DWithId(int gridDim)
        {
            grid_ = new SpatialHashGridWithMinMaxBounds3D<TChild, T>(gridDim);
        }


        public TChild Retrieve((T, T, T) coordinates)
        {
            try
            {
                return grid_.Retrieve(coordinates);
            }
            catch { }
            return default(TChild);
        }

        public object Retrieve(object coordinates)
        {
            try
            {
                (T, T, T)? valueTuple = coordinates as (T, T, T)?;
                return Retrieve(valueTuple);
            }
            catch { }
            return default(TChild);
        }

... ... ... ...
}

注意:这不是堆栈溢出。该函数始终返回 null。

return Retrieve(valueTuple);
--- 此行永远不会执行。

c# visual-studio
1个回答
0
投票

请勿使用

(T,T,T)
符号 - 它是
ValueTuple
,而不是
Tuple
。在任何地方使用明确的
Tuple<T,T,T>
就应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.