c# - “无法使用实例引用访问成员,而是使用类型名称对其进行限定”并且我确实使用类型名称
问题描述
我有一个这样的示例代码:
public class SimpleLogger
{
private static SimpleLogger logger;
private string path = null;
protected SimpleLogger(string path)
{
this.path = path;
}
public static SimpleLogger Instance(string path)
{
if (logger == null)
{
logger = new SimpleLogger(path);
}
return logger;
}
public static void Info(string info)
{
string path = $"{logger.path}{DateTime.Now.ToShortDateString()}_Info.txt";
using (StreamWriter writer = new StreamWriter(path))
{
writer.WriteLine($"{DateTime.Now} - {info}");
}
}
}
当我打电话时:
SimpleLogger.Instance("path").Info("info");
有一个错误:
无法使用实例引用访问成员 使用类型名称而不是静态方法来限定它
但我确实使用类型名称,不是吗?
但是当我这样称呼它时:
SimpleLogger.Instance("path");
SimpleLogger.Info("info");
它实际上工作正常。
为了使其内联工作,我必须使 Info 方法非静态,然后内联调用也可以正常工作。这是为什么?我不明白这里的机制。有人可以解释吗?是否因为 Instance 方法返回 SimpleLogger 对象,然后 info 需要是非静态的才能在实例而不是类型上工作?
解决方案
和你写的完全一样。您在类上调用静态方法,不能在对象上调用它们,并且您的Instance
方法返回SimpleLogger
类的具体对象。如果要链接方法(即。SimpleLogger.Instance("path").Info("info");
),则必须更改Info(string info)
为非静态类。让这些方法是非静态的更有意义,并使类成为Singleton
推荐阅读
- php - 在反向代理后面运行的 apache2/php 容器不尊重重定向中的转发端口和原型?
- xamarin.forms - 如何在跨平台移动应用项目(VS 2017/Xamarin)中实现 WkWebView?
- docker - 无法删除 Docker 容器中的文件夹
- angular - Angular CLI 6 - 使用源映射构建 Angular 库
- angular - 运行 ng build 后 index.html 不直接放在 dist 文件夹下
- c++ - 从命令行将文本文件读入向量
- derby - Artifactory 问题(可能与 Derby 有关)
- c++ - 从函数返回一个包含另一个对象的对象
- azure - 到 Azure Web 应用程序的 VSTS 发布管道部署到 wwwroot 子目录
- build - 如何使 CMake 使用环境变量 LD_LIBRARY_PATH 和 C_INCLUDE_DIRS