建议的重复确实是一个类似的问题。但是,那里的答案仅涉及一个选项-禁用ToString()本身。还有其他可能的解决方案,例如让Visual Studio警告我,或者不调用ToString()(仔细阅读答案,他假定它被调用了 ,并仅说明存在不能“删除” ToString()。),或使用较低版本的C#(它是否始终以这种方式工作?),等等。
当我在代码中期望使用字符串的某个地方有一个非字符串时,我不希望它自动转换为字符串。我想要一个错误。例如:
public string Stringify()
{
return Data + Environment.NewLine;
}
Data
是我不想得到的byte[]
:
System.Byte []
我想得到一个错误,所以我知道我需要修复它。 (有必要进行强类型键入。)
那么,有一种方法可以使Visual Studio / C#/。Net在使用非字符串作为字符串时向我显示错误/抛出异常?
答案 0 :(得分:1)
可以在Visual Studio 2017中使用Nuget在您的项目中安装Rosyln分析器。
特别是,如果在类中没有ToString()
,则有一个Rosyln分析器检查对ToString()
的隐式和显式调用。 https://www.nuget.org/packages/ToStringWithoutOverrideAnalyzer/
已安装的分析仪可以在参考文献中找到
默认情况下,此分析器将产生警告,如带有!
的三角形所示,但是右键单击规则,您可以将任何规则提升为错误,或将其简化为参考。
Console.Write
和Console.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,并提供了指向之前已完成该操作的链接。我不是在这里发布这些评论来窃取答案,但我同意,这可能是您想要的最佳解决方案。另一个选择是使用反射,但是直到运行时才起作用。