C# 包含#if的多行字符串,位于较大的#if条件块内的新行中
我有一些C#代码,其中包含一个多行字符串(这是一些代码模板),其中有些行以C# 包含#if的多行字符串,位于较大的#if条件块内的新行中,c#,C#,我有一些C#代码,其中包含一个多行字符串(这是一些代码模板),其中有些行以#if something开头。这一切都可以正常工作,除非我将整个C#类包装在实际条件#if#endif,在这种情况下编译器会说“无效的预处理器指令” 代码段: #if WIN32 class Something { string s = @" #if SOMETHING #endif"; } #endif 有没有办法让这一切顺利进行? 我曾考虑在代码模板中使用不同的字符,并使用替换来修复它,但这对我来说不是一个
#if something
开头。这一切都可以正常工作,除非我将整个C#类包装在实际条件#if
#endif
,在这种情况下编译器会说“无效的预处理器指令”
代码段:
#if WIN32
class Something {
string s = @"
#if SOMETHING
#endif";
}
#endif
有没有办法让这一切顺利进行?
我曾考虑在代码模板中使用不同的字符,并使用替换来修复它,但这对我来说不是一个很好的解决方案,因为它使代码模板更难理解。我认为您将“和”放在了错误的位置。这很好,没有任何抱怨
#if DEBUG
class Something {
readonly string s = @"
#if CODE_DEFINED_ONLY_IF_SET
public class IAmOnlyHappyWhenItRains{
public int Year{get;set;}
public string Name{get;set;}
}
#endif
";
}
#endif
我会这样做:
const string hash = "#";
#if WIN32
class Something {
string s = $@"
{hash}if SOMETHING
{hash}endif";
}
#endif
看起来c语言团队已经注意到了-谢谢!我找不到那个bug报告,谢谢。没有建议的解决方法,我想我必须接受“替换”解决方法…或者我可以将我的多行字符串拆分为单独的字符串,这样他们就可以在行的开头有一个引号
“
。@Lordalcol,更好的方法是定义资源文件。这应该可以工作,但会降低字符串中的代码模板的可读性。是的,但至少您不需要担心破坏编译器。尽管此示例似乎可以工作,但编译器仍然试图解析字符串的内容,这可能会破坏内容。@Bizhan很抱歉,我不理解你的意思。请详细说明一下好吗?重点是预编译器实际上会详细说明
指令。如果多行字符串中有一个#else
,它将中断。如果你写!调试第一行中的,然后从字符串中删除#endif
,然后编译器将解析第二行#if
,并查找其匹配的#endif
。此外,您的示例在post-Rosyln编译器中工作,但不适用于我正在使用的Mono编译器。