代码之家  ›  专栏  ›  技术社区  ›  ispiro

当使用非字符串作为字符串(而不是自动使用ToString)时,如何获得显示的错误?

  •  2
  • ispiro  · 技术社区  · 6 年前

    建议的副本确实是一个类似的问题。但是,这里的答案只包含一个选项——禁用toString()本身。还有其他可能的解决方案,例如让Visual Studio警告我,或者不调用ToString()(请仔细阅读此处的答案,他假定 调用,并解释说没有“删除”toString()的方法,也没有使用较低版本的c(它总是这样工作的吗?)等等…

    当我有一个非字符串在某个地方,代码需要一个字符串时,我不希望它自动转换为字符串。我想要一个错误。例如:

    public string Stringify()
    {
        return Data + Environment.NewLine;
    }
    

    Data 是一个 byte[] 我不想得到:

    字节的系统

    我想得到一个错误,所以我知道我需要修复它。(打字很强是有原因的。)

    那么,有没有一种方法可以让Visual Studio/C/.NET在使用非字符串作为字符串时向我显示错误/引发异常?

    3 回复  |  直到 6 年前
        1
  •  1
  •   TJ Rockefeller    6 年前

    Rosyln分析器可以使用Visual Studio 2017中的Nuget安装在项目中。

    特别是,有一个Rosyln分析器可以检查对 ToString() 如果 托斯特林() 在类中不被重写。 https://www.nuget.org/packages/ToStringWithoutOverrideAnalyzer/

    安装的分析仪可在参考文件中找到。

    enter image description here

    默认情况下,此分析器将生成警告,如三角形所示 ! ,但右键单击规则,可以将任何规则提升为错误,或将其减少为信息性错误。

    潜在的成功

    Console.Write Console.WriteLine 有多个重载,包括 Console.Write(object value) ,因此,如果要打印一些尚未覆盖的对象 托斯特林() 喜欢 Console.Write(myCustomObject) 分析器不会捕捉到这一点,因为没有进行隐式转换(至少在您编写的代码中是这样)

        2
  •  0
  •   Peter Kalef ' DidiSoft    6 年前

    您可以显式地尝试转换数据,如果它不是字符串,则VS会抱怨

    public string Stringify()
    {
        return (string)Data + Environment.NewLine;
    }
    
        3
  •  0
  •   Michael Puckett II    6 年前

    当你拥有 string 键入并使用 + operator 然后它会呼叫 virtual ToString() 任何类型的方法 一串 自动地。

    通过添加类型来生成 一串 (至少不是以简单或实际的方式)。

    你可以做些别的事情,比如

    return (Data is string value) 
           ? value + Environment.NewLine
           : throw new Exception("Not a string"); //or return whatever else you want here.
    

    如果你想确定 Data 永远是 一串 如果不进行测试,那么我将把它作为参数传递给方法。

    public string Stringify(string data)
    {
        return data + Environment.NewLine;
    }
    

    显而易见的情况;如果你想 数据 成为一个领域,永远是一个 一串 是申报 数据 作为一个 一串 首先。

    编辑:

    正如上面的评论所述;我现在理解您希望基本上标记 虚拟ToString() 呼叫以防止此类操作发生。我们给出了一条评论来更新Roslyn分析器,并提供了一个链接,指向以前已经做过的地方。我不是在这里发布这些评论来窃取答案,但我同意,这可能是你想要的最佳解决方案。另一种选择是使用反射,但直到运行时才起作用。