'Stream'是一种类型,在给定的上下文中无效

时间:2018-08-01 19:51:33

标签: c#

我正在尝试编写一个不和谐的bot,在这里我需要从另一个文件中检索令牌,但是我正在使用的代码抛出错误(请参阅标题/主题)。我的代码是这样的:

string TOKEN = "";
using (var Stream = new FileStream((Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)).Replace(@"bin\Debug\netcoreapp2.0", @"Data\Token.txt"), FileMode.Open, FileAccess.Read));
using (var ReadToken = new StreamReader(Stream)) {
    TOKEN = ReadToken.ReadToEnd();  
}

我确定文件在正确的路径中,所以我不知道是什么原因导致了错误
如果我应该提供更多代码,请在评论中让我知道!

1 个答案:

答案 0 :(得分:1)

典型的C#约定是对局部变量使用camelCase样式的标识符名称,这有助于防止您无意中将变量命名为与作用域中的某些类型相同的变量。

支持声明与另一个标识符同名的变量 ,那么为什么编译器会感到困惑?这是因为您的第一个using语句具有;,这限制了该Stream变量的范围为 just using语句。因此,在new StreamReader(Stream)表达式中,编译器认为Stream指的是范围内的Stream类型,而不是不再知道的变量。

建议的更改:

var token = "";
using (var stream = new FileStream((Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)).Replace(@"bin\Debug\netcoreapp2.0", @"Data\Token.txt"), FileMode.Open, FileAccess.Read))
using (var readToken = new StreamReader(stream)) {
    token = readToken.ReadToEnd();  
}

...或者为使使用范围更容易混淆,您可以显式使用花括号使内容更清晰:

var token = "";
using (var stream = new FileStream((Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)).Replace(@"bin\Debug\netcoreapp2.0", @"Data\Token.txt"), FileMode.Open, FileAccess.Read)) {
    using (var readToken = new StreamReader(stream)) {
        token = readToken.ReadToEnd();  
    }
}