我一直在尝试让这个程序运行,但是当我尝试运行它时,没有任何反应。我试图调试,它告诉我我有一个TypeInitializationException,所以我在网上寻找修复,但我找不到任何可以帮助我的东西。这是我的代码;程序是一个GUI,计算机随机选择三个字母(A,B或C)中的一个,并且用户试图猜测选择了哪个字母。高分裂被保存到文件中,并从该文件中读取并显示。
非常感谢任何帮助。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace HighScore
{
public partial class Form1 : Form
{
const string FILENAME = @"C:\\Guess\\Data.txt";
static FileStream outFile = new FileStream(FILENAME, FileMode.Create, FileAccess.Write);
StreamWriter writer = new StreamWriter(outFile);
static FileStream file = new FileStream(FILENAME, FileMode.Open, FileAccess.Read);
StreamReader reader = new StreamReader(file);
string answer;
string input;
int writenum;
string num;
public Form1()
{
InitializeComponent();
}
private void label1_Click(object sender, EventArgs e)
{
}
private void label2_Click(object sender, EventArgs e)
{
}
private void label3_Click(object sender, EventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
Random ranNumberGenerator = new Random();
int randomNumber;
int x;
num = reader.ReadLine();
writenum = Convert.ToInt32(num);
label1.Text = "Score: " + writenum;
label1.Visible = true;
randomNumber = ranNumberGenerator.Next(1, 3);
if (randomNumber == 1)
{
answer = "a";
}
if (randomNumber == 2)
{
answer = "b";
}
if (randomNumber == 3)
{
answer = "c";
}
if (textBox1.Text == "a")
{
input = "a";
}
if (textBox1.Text == "b")
{
input = "b";
}
if (textBox1.Text == "c")
{
input = "c";
}
if (answer == input)
{
label2.Text = "Correct! Computer guessed " + answer + " and you guessed " + input;
label2.Visible = true;
num = reader.ReadLine();
writenum = Convert.ToInt32(num);
writenum = writenum + 1;
num = writenum.ToString();
}
for (x = 0; x < 10; ++x)
{
button1.Enabled = false;
}
}
}
}
答案 0 :(得分:2)
鉴于你得到一个TypeInitializationException
,它意味着错误发生在静态构造函数(这个类没有)中,或者在静态字段的初始化期间(它发生)。
在上面的代码中,两个静态字段都是FileStream
,因此必须在初始化期间发生异常;在你的任何其他代码运行之前。
我不禁注意到您正在创建一个用于阅读的流和一个用于写入的流,两者都指向相同的文件 - 这是故意的吗?
异常的原因是您打开一个文件进行写入 - 默认情况下,它不会与另一个文件流共享。然后在同一个文件上打开第二个文件流进行读取 - 这会引发异常。如果您真的打算从同一个文件读取/写入,那么您需要使用其他构造函数重载来指定共享语义:
FileStream outFile = new FileStream(FILENAME, FileMode.Create, FileAccess.Write, FileShare.Read);
FileStream file = new FileStream(FILENAME, FileMode.Open, FileAccess.Read, FileShare.Write);
一般来说 - 我会避免将这些作为静态字段。使它们成为实例属性,在构造函数中初始化它们。做一些屏障检查会更容易,并在出错时进行调试。
作为注释:TypeInitializationException
是“特殊的”;一旦你有一次这个例外并且CLR未能初始化类型,你每次尝试访问类型时总是获取它 - 它是“一次失败,总是失败”的情况
答案 1 :(得分:0)
这是由静态构造函数引起的。看一下静态字段初始化。
您发布的代码并未指明任何此类构造。看看你项目的其他地方。