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

时间:2019-01-24 19:52:17

标签: c# .net visual-studio

建议的重复确实是一个类似的问题。但是,那里的答案仅涉及一个选项-禁用ToString()本身。还有其他可能的解决方案,例如让Visual Studio警告我,或者不调用ToString()(仔细阅读答案,他假定它被调用了 ,并仅说明存在不能“删除” ToString()。),或使用较低版本的C#(它是否始终以这种方式工作?),等等。

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

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

Data是我不想得到的byte[]

  

System.Byte []

我想得到一个错误,所以我知道我需要修复它。 (有必要进行强类型键入。)

那么,有一种方法可以使Visual Studio / C#/。Net在使用非字符串作为字符串时向我显示错误/抛出异常?

3 个答案:

答案 0 :(得分:1)

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

特别是,如果在类中没有ToString(),则有一个Rosyln分析器检查对ToString()的隐式和显式调用。 https://www.nuget.org/packages/ToStringWithoutOverrideAnalyzer/

已安装的分析仪可以在参考文献中找到

enter image description here

默认情况下,此分析器将产生警告,如带有!的三角形所示,但是右键单击规则,您可以将任何规则提升为错误,或将其简化为参考。

可能的陷阱

Console.WriteConsole.WriteLine有多个重载,包括Console.Write(object value),因此,如果您要打印一些未覆盖ToString()的对象,例如Console.Write(myCustomObject),则分析器将不能理解这一点,因为没有进行隐式转换(至少在您编写的代码中)

答案 1 :(得分:0)

您可以显式尝试强制转换Data,如果VS不是字符串,VS将会抱怨

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

答案 2 :(得分:0)

当您使用string类型并使用+ operator时,它将为不是virtual ToString()的任何类型调用string方法自动。

仅通过添加类型以产生string(至少不是以简单或实用的方式),就无法避免这种情况。

您可以改为执行其他操作;例如

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

如果您想确保Data始终是string而不经过测试,那么我会将其作为参数传递给方法。

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

明显的情况;如果您希望Data是一个字段,并且总是将string声明为Data的{​​{1}}。

编辑:

如以上评论所述;我现在了解到,您基本上希望标记任何使用string的调用,以防止发生此类操作。发表了评论以更新Roslyn Analyzer,并提供了指向之前已完成该操作的链接。我不是在这里发布这些评论来窃取答案,但我同意,这可能是您想要的最佳解决方案。另一个选择是使用反射,但是直到运行时才起作用。