C# 原语、泛型和重载-接口方法返回类型可以定义为一组结构和原语吗?
我有此接口定义的组件:C# 原语、泛型和重载-接口方法返回类型可以定义为一组结构和原语吗?,c#,C#,我有此接口定义的组件: public interface IAgentObservation<T> { T GetObervation(); } 但这感觉远非理想 你能告诉我们向量存储在哪里吗?我不明白您现在如何将不同的类型存储在一个列表中。AddVectorObsForType(对象测试)。泛型版本没有:如果编译时已知t,只需让编译器选择适当的AddVectorObs()重载即可。通过“一些结构和原语集”,您是说要返回联合,还是?如果可以的
public interface IAgentObservation<T>
{
T GetObervation();
}
但这感觉远非理想 你能告诉我们向量存储在哪里吗?我不明白您现在如何将不同的类型存储在一个列表中。
AddVectorObsForType(对象测试)
。泛型版本没有:如果编译时已知t
,只需让编译器选择适当的AddVectorObs()
重载即可。通过“一些结构和原语集”,您是说要返回联合,还是?如果可以的话,你能展示一些伪代码来说明你想用它做什么吗?每种类型都被转换成若干浮点数并添加到一个列表中(由机器学习代理使用)。我可以让我的接口方法返回一个float数组并直接添加它们,但我更愿意重用已经存在的object->float[]转换方法
protected void AddVectorObs(bool observation);
protected void AddVectorObs(Quaternion observation);
protected void AddVectorObs(bool observation);
protected void AddVectorObs(IEnumerable<float> observation);
private void AddVectorObsForType<T>(T test)
{
switch (test)
{
case float f:
AddVectorObs(f);
break;
case int i:
AddVectorObs(i);
break;
case Vector3 v3:
AddVectorObs(v3);
break;
case Vector2 v2:
AddVectorObs(v2);
break;
case IEnumerable<float> ef:
AddVectorObs(ef);
break;
case Quaternion q:
AddVectorObs(q);
break;
case bool b:
AddVectorObs(b);
break;
case ValueTuple<int,int> t:
AddVectorObs(t.Item1, t.Item2);
break;
default:
throw new Exception("Unsupported observation vector type: " + typeof(T));