2014-12-03 54 views
2

我将api中的一串字符串转换为类。我广泛使用编译器来帮助我,因为我可以替换核心API中的某些类型,并遵循类型错误。禁止字符串与对象连接

然而,有缺陷的这种方法令人沮丧的源:

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

class Foo { 
} 

C#将愉快地加在一起的字符串和任何用户定义的对象。有没有办法将它变成警告或编译错误?

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

+0

写愚蠢的代码没有任何警告! :) – DavidG 2014-12-03 09:25:43

+0

为什么这必须是警告或错误? – Dennis 2014-12-03 09:28:09

+0

@DavidG我处于重构状态。我有50多个班级一起交流。我想用由一个类表示的一些其他数据替换由字符串表示的一些数据。在使用字符串连接的类中,我想使用其他形式的组合。如果编译器不能帮助我,那意味着我可能会错过一些东西,并且用户会在应用程序中看到不相关的类名。 – Simon 2014-12-03 09:30:23

回答

3

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

是 - 如果你正在使用Visual Studio 2015年或更高:)

您可以使用Roslyn来创建自己的代码的诊断/代码修复,而且我相信您可以从升级的问题仅仅是一个错误的警告。然后,您可以在持续集成构建中包含此诊断。

要小心你走多远 - 虽然我通常会尝试在代码审查中处理这个问题,而不是使其成为完全错误。创建您自己的C#方言可能是一个不切实际的倾斜...

请注意,在某些情况下,您提供的代码可能完全合适 - 例如,Foo覆盖ToString()。你真的肯定你想禁止吗?

+0

谢谢你的回答。我相信我想禁止所有继承一些抽象类或实现给定接口的类。我希望更简单一些。由于我们使用visual 2013,我会尝试编写一个fxcop规则。我希望有一个更简单的解决方案可以存在:-(拥有这样的默认行为,而不是'IRepresentable'界面似乎很疯狂 – Simon 2014-12-03 09:36:29

+0

我们正在进行评论,但是“风险表面”在这一块上真的很大 – Simon 2014-12-03 09:37:56

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(); 
+0

很遗憾这个方法不会在var s =“”+(new Test())上产生警告;' – Simon 2014-12-03 10:55:57

+0

是的,我在我的回答中提到过,但它会产生运行时异常。 – DavidG 2014-12-03 10:56:38