我有两个版本的
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);
--- 此行永远不会执行。
请勿使用
(T,T,T)
符号 - 它是 ValueTuple
,而不是 Tuple
。在任何地方使用明确的 Tuple<T,T,T>
就应该可以工作。