Int32.TryParse 抛出 NullReferenceException

Int32.TryParse throwing NullReferenceException

注意: What is a NullReferenceException, and how do I fix it?

无法回答

我现在遇到了一个奇怪的错误。我对 Int32.TryParse(string, out int) 的调用给了我一个 System.NullReferenceException

想法非常简单 - 用技术表示代替元数据条目,而不是使用整数值:

public void GenerateClipName()
{
    // Copy metadata entries, to prevent modifications on the actual viewmodel
    var metadataEntries = ViewModel.MasterObject.MetadataEntries.Copy();
    // Get the correct entry
    var entry = metadataEntries.Single(m => m.Key.EndsWith("/" + MetaDataKeys.TITLE));
    // Get all valid entries for the metadata key
    var validEntries = MetadataDefinitions.Single(x => x.Id.EndsWith("/" + MetaDataKeys.TITLE));
    int parsedInt;
    // Try to parse the integer value, and replace it with the technical representation
    if (int.TryParse(entry.Value, out parsedInt))
        entry.Value = validEntries.ValidEntries.Single(m => m.Value == parsedInt).TechnicalRepresentation;

    // Some further actions will be implemented here later
}

但是 "expected output" 更像是 "unexpected output":

编辑window下面的Localswindow可以看到:entry.Value的值为“86”。

编辑#1: 根据要求,执行 Int32.TryParse 之前的变量:

编辑#2: 异常堆栈跟踪:

at ...Presenter.GenerateClipName()
at ...Presenter.Cancel()
at ...View.CancelButton_Click(object sender, System.Windows.RoutedEventArgs e)

堆栈跟踪不包括 Int32.TryParse 方法,这让我有些疑惑。

我怀疑 null 引用与您的字符串无关,而是与您的 out 变量有关:注意在屏幕截图的底部,您的 parsedInt 为 null。就我个人而言,我不喜欢可为空的整数,但如果您在创建它时将其简单地初始化为 0 (int parsedInt = 0;),它应该可以解决您的问题。

out 参数修饰符不能return 空值,而且我在您的调试中看到window 似乎是这样。尝试给它一个值。

Although variables passed as out arguments do not have to be initialized before being passed, the called method is required to assign a value before the method returns.

关于输出参数:https://msdn.microsoft.com/en-us/library/t3c3bfhx.aspx

关于您的代码,您正在使用 int.TryParse(string, out int),请尝试将其更改为 Int32.TryParse(string, out int),看看是否能解决问题。

终于想通了:
调试资源,而 运行 在 Release 模式下,与已编译的 Release 资源相同。 但是,由于通过拖动(黄色)调试光标在代码中跳来跳去,Visual Studio 弄乱了特定行的信息。 因此,NullReferenceException 被抛出。