给出这样一种类型:

class Supplier
{
    public Supplier(string name) => Name = name;

    public string Name { get; }
}

当将对象supplier以前属于string类型的代码重构为对象supplier现在属于Supplier类型的代码时,我将冒着丢失的风险来更改此类型的代码:

var supplier = new Supplier("Acme Inc.");
Console.WriteLine($"foo bar {supplier}");      // foo bar Supplier
Console.WriteLine($"foo bar {supplier.Name}"); // foo bar Acme Inc.

显然,问题是第一个输出行仍然可以编译,但生成了一个非预期的字符串,因为Object中的ToString返回对象类型的名称.

Is there anyway I can prevent the first output line to compile?

或者是我唯一能得到的帮助来推翻ToString:

public override string ToString() => Name;

推荐答案

总结 comments 中给出的解决方案,并添加一些:

  • 用异常抛出实现重写ToString(对于补时捕获无用)
  • 重写ToString以返回Name属性.修复了问题,但也不是您所要求的really.

添加:

  • 创建一个检测使用情况的analyzer.这可能是overkill
  • 手动在代码库中搜索"Supplier",并在需要的地方进行修复.单调乏味,容易错过机会.

挑选你的毒药...

Csharp相关问答推荐

为什么我在PuppeteerSharp中运行StealthPlugin时会出现错误?

在Dapper中使用IasyncEum重写GetAsyncEum方法

有没有一种方法可以防止在编译时在MicrosoftC或非单线程上下文中调用方法?

Entity Framework Core 8 dbcontext—无法以多对多关系添加某些行'

如何在Visual Studio代码中更改大括号模式{},用于C#语言

如何从HttpContext获取请求正文

如果存在对CodeAnalysis.CSharp的引用,则不能引用netStandard2.0库

HttpConext.Request.Path和HttpConext.GetEndpoint()之间的差异

如何在C#中从正则表达式中匹配一些数字但排除一些常量(也是数字)

HttpRequestMessage.SetPolicyExecutionContext不会将上下文传递给策略

如何在CSharp中将json字符串转换为DataTable?

将操作从编辑页重定向到带参数的索引页

如何从另一个类的列表中按ID取值

如何在特定环境中运行dotnet测试?

为什么Swashbakle/Swagger在参数中包含变量名?

使用SQL Server 2022+时,我是否必须将代码从SqlConnection类对象中迁移出来?

如何更改Datagridview行标题

我什么时候不应该在Dispose中调用EgSuppressFinalize(This)?

Windows 10上埃及标准时间的时区偏移不正确

ASP.NET Core 7空字符串