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
被抛出。
注意: 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
被抛出。