我有一个方法,它接受一个接口类型并评估类型是什么,从中我需要返回一个与之相关的类型。但我不确定如何使类型返回灵活。我试过这样的事情:
public static T GridPosition <T>(IReSizeableGrid gridData) {
if (gridData is Hex) {
var hexGrid = (HexGrid) gridData;
return HexLibrary.WorldToHex(WorldPoint(Input.mousePosition, GroundPlane), hexGrid);
}
if (gridData is QuadGrid) {
var quadGrid = (QuadGrid) gridData;
return Grid.Get(WorldPoint(Input.mousePosition, GroundPlane), quadGrid);
}
throw new Exception("Wrong type passed to GridPosition: " + gridData.GetType());
}
但是我收到了这个错误:
无法隐式转换类型
Hex to T
我是否使用T
在右侧?试着了解如何正确使用它。
答案 0 :(得分:7)
有时候,仿制药并不是正确的答案。如果您想对两个或多个相关类型执行 相同的事情 ,则只能使用泛型。在这种情况下,您正在做完全不同的事情,因此您实际上需要使用method overloading代替。
public static Point GridPosition(HexGrid gridData)
{
return HexLibrary.WorldToHex( WorldPoint( Input.mousePosition, GroundPlane), gridData);
}
public static Point GridPosition(QuadGrid gridData)
{
return Grid.Get(WorldPoint(Input.mousePosition, GroundPlane), gridData);
}
您可以使用相同的代码调用其中任何一个:
var result = GridPosition(new HexGrid());
var result = GridPosition(new QuadGrid());
...编译器将为您挑选合适的版本。
答案 1 :(得分:0)
由于Hex
和QuadGrid
实施IReSizeableGrid
,您可以将gridData
参数的类型设为T
,然后限制T
到IReSizeableGrid
:
public static T GridPosition<T>(T gridData) where T : IReSizeableGrid {
if (gridData is Hex) {
var hexGrid = (HexGrid) gridData;
return (T)HexLibrary.WorldToHex(WorldPoint(Input.mousePosition, GroundPlane), hexGrid);
}
if (gridData is QuadGrid) {
var quadGrid = (QuadGrid)gridData;
return (T)Grid.Get(WorldPoint(Input.mousePosition, GroundPlane), quadGrid);
}
throw new Exception("Wrong type passed to GridPosition: "+gridData.GetType());
}
调用函数时,不需要指定类型<T>
。它将取自gridData
参数的类型。