C# 追查NaN浮动的原因

C# 追查NaN浮动的原因,c#,C#,我有浮点数组 public float[] Outputs; 在我的代码中,有东西正在更新数组值并导致一个NaN。这是一个非常罕见的错误,我一生都不知道是什么导致了它 我如何用最少的代码更改来跟踪它?最好将该数组设为私有并重命名,然后创建一个名为Outputs for getting and setting的属性,该属性在每次设置时都进行NaN检查。然后,当设置了NaN并检索调用堆栈时,我可以很容易地引发异常,而不是在另一段代码尝试使用它时发现它。类似这样的东西——实际上是编译的 我得到一个错

我有浮点数组

public float[] Outputs;
在我的代码中,有东西正在更新数组值并导致一个NaN。这是一个非常罕见的错误,我一生都不知道是什么导致了它

我如何用最少的代码更改来跟踪它?最好将该数组设为私有并重命名,然后创建一个名为Outputs for getting and setting的属性,该属性在每次设置时都进行NaN检查。然后,当设置了NaN并检索调用堆栈时,我可以很容易地引发异常,而不是在另一段代码尝试使用它时发现它。类似这样的东西——实际上是编译的

我得到一个错误:

"Bad array declarator: To declare a managed array the rank specifier precedes 
 the variable's identifier. To declare a fixed size buffer field, use the fixed 
 keyword before the field type."
这是我的密码:

    public float[] _outputs;

    public float Outputs[int index]   
    {
        get
        {
            return _outputs[index];
        }
        set
        {
            if (float.IsNaN(value))
                throw new Exception("Blar blar");
            _outputs[index] = value;
        }
    }
编辑:感谢您提供答案,其他任何寻求答案的人都可能希望阅读以下内容:

实际上,不可能用特定名称声明索引器。您必须将对象环绕并使用:

public float this[int index] { ...}
在本例中,您可以使用包装器类:

public class ArrayWrapper
{
    public float this[int index] { ...}
    public ArrayWrapper(float[] values) { .... }
}
要使用它,您需要使用
ArrayWrapper
-类作为属性类型

作为替代方案,您可以使用扩展方法(不太好,因为您需要更改代码):

并以这种方式使用它:

targetObject.Outputs.SetFloat(0, Single.NaN);

您不能在C#中使用命名索引器,作为一种解决方法,您可以执行以下操作:

public class Indexer<T>
{
    private T[] _values;

    public Indexer(int capacity)
    {
        _values = new T[capacity];
    }

    protected virtual void OnValueChanging(T value)
    {
        // do nothing
    }

    public T this[int index]
    {
        get { return _values[index]; }
        set
        {   
            OnValueChanging(value);
            _values[index] = value;
        }
    }
}

public class FloatIndexer : Indexer<float>
{
    public FloatIndexer(int capacity)
        : base(capacity)
    {
    }

    protected override void OnValueChanging(float value)
    {
        if (float.IsNaN(value))
            throw new Exception("Blar blar");
    }
}

public class Container
{
    public Container()
    {
        Outputs = new FloatIndexer(3);
    }

    public FloatIndexer Outputs { get; private set; }
}
...
var container = new Container();
container.Outputs[0] = 2.5f;
container.Outputs[1] = 0.4f;
container.Outputs[2] = float.NaN; // BOOM!
...
公共类索引器
{
私人T[]_值;
公共索引器(int容量)
{
_值=新的T[容量];
}
受保护的虚拟void OnValueChanging(T值)
{
//无所事事
}
公共T此[int索引]
{
获取{返回_值[索引];}
设置
{   
OnValueChanging(值);
_数值[指数]=数值;
}
}
}
公共类浮动索引器:索引器
{
公共浮动索引器(整数容量)
:基本(容量)
{
}
受保护的覆盖无效OnValueChangeing(浮动值)
{
if(float.IsNaN(值))
抛出新异常(“Blar Blar”);
}
}
公营货柜
{
公共容器()
{
输出=新的浮动索引器(3);
}
公共FloatIndexer输出{get;private set;}
}
...
var container=新容器();
容器输出[0]=2.5f;
容器输出[1]=0.4f;
container.Outputs[2]=float.NaN;//繁荣
...

我将其更新为更通用的版本,以便您可以将其重新用于各种其他类型,而不仅仅是
float

您的问题是什么?为什么不起作用?我已对其进行了更新,以使问题更加清楚。我无法编译代码。扩展方法建议还需要将
索引
作为参数传入。@James Right我做得很快,忘了它。
public class Indexer<T>
{
    private T[] _values;

    public Indexer(int capacity)
    {
        _values = new T[capacity];
    }

    protected virtual void OnValueChanging(T value)
    {
        // do nothing
    }

    public T this[int index]
    {
        get { return _values[index]; }
        set
        {   
            OnValueChanging(value);
            _values[index] = value;
        }
    }
}

public class FloatIndexer : Indexer<float>
{
    public FloatIndexer(int capacity)
        : base(capacity)
    {
    }

    protected override void OnValueChanging(float value)
    {
        if (float.IsNaN(value))
            throw new Exception("Blar blar");
    }
}

public class Container
{
    public Container()
    {
        Outputs = new FloatIndexer(3);
    }

    public FloatIndexer Outputs { get; private set; }
}
...
var container = new Container();
container.Outputs[0] = 2.5f;
container.Outputs[1] = 0.4f;
container.Outputs[2] = float.NaN; // BOOM!
...