禁止字符串&对象连接

时间:2014-12-03 09:23:19

标签: c#

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

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

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

class Foo {
}

C#将愉快地将字符串和任何用户定义的对象相加。有没有办法将其转换为警告或编译错误?

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

2 个答案:

答案 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();