禁止字符串和对象连接

本文关键字:对象连接 字符串 禁止 | 更新日期: 2023-09-27 18:32:52

我正在将 api 中的一堆字符串转换为类。我广泛使用编译器来帮助我解决这个问题,因为我可以替换核心 API 中的某些类型,并遵循类型错误。

但是,这种方法存在令人沮丧的错误来源:

// linqpad snippet
void Main()
{
    var t = "yay : " + (new Foo());
    t.Dump(); // "yay: namespace.Foo" instead of compilation error
}
class Foo {
}

C# 将很乐意将字符串和任何用户定义的对象加在一起。有没有办法将其变成警告或编译错误?

我想要一个编译错误,因为这些数据最终会显示给用户。如果我错过了一个连接,用户将在应用程序中看到类名,这不是我真正想要的行为。

禁止字符串和对象连接

C# 将很乐意将字符串和任何用户定义的对象加在一起。有没有办法将其变成警告或编译错误?

是 - 如果您使用的是 Visual Studio 2015 或更高版本:)

您可以使用 Roslyn 创建自己的代码诊断/代码修复,我相信这可以让你将问题从只是一个警告升级到一个错误。然后,可以将此诊断包含在持续集成生成中。

不过要小心你走了多远 - 我通常会尝试在代码审查中处理这个问题,而不是让它成为一个彻头彻尾的错误。创建自己的 C# 方言可能是一个滑坡......

请注意,在某些情况下,您提供的代码可能是完全合适的 - 例如,如果Foo覆盖ToString()。你真的确定要禁止这个吗?

一种可能的解决方案(可能不合适)是重写类中的 ToString 方法并使它们引发错误。这不会给你编译时错误,但会给出运行时异常:

public class Test
{
    public override string ToString()
    {
        throw new NotImplementedException();
    }
}

当然,如果您已经覆盖了ToString,那将是不好的.作为额外的级别,您可以装饰覆盖以指示不使用该方法:

[Obsolete("Don't use this!")]
public override string ToString()
{
    throw new NotImplementedException();
}

虽然这对您发布的代码没有影响,但您应该在显式调用 ToString 的任何地方收到警告,例如,这将给出编译器警告:

var s = (new Test()).ToString();