我将api中的一堆字符串转换为类。我正在广泛使用编译器来帮助我,因为我可以替换核心apis中的某些类型,并遵循类型错误。
然而,这种方法存在令人沮丧的错误来源:
// linqpad snippet
void Main()
{
var t = "yay : " + (new Foo());
t.Dump(); // "yay: namespace.Foo" instead of compilation error
}
class Foo {
}
C#将愉快地将字符串和任何用户定义的对象相加。有没有办法将其转换为警告或编译错误?
我想要编译错误,因为这些数据最终会显示给用户。如果我错过了一个连接,用户将在应用程序中看到类名,这实际上不是我想要的行为。
答案 0 :(得分:3)
C#将愉快地将字符串和任何用户定义的对象相加。有没有办法将其转换为警告或编译错误?
是 - 如果您使用的是Visual Studio 2015或更高版本:)
您可以使用Roslyn创建自己的代码诊断/代码修复程序,而我相信这可以让您将问题从仅仅警告升级为错误。然后,您可以在持续集成构建中包含此诊断。
请注意你对此有多远 - 我通常会尝试在代码审查中处理此问题,而不是将其作为一个彻头彻尾的错误。创建自己的C#方言可能是一个滑坡...
请注意,在某些情况下,您提供的代码可能完全合适 - 例如Foo
会覆盖ToString()
。你真的肯定你要禁止这个吗?
答案 1 :(得分:1)
一种可能的解决方案(可能不合适)是覆盖类中的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();