Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 包含#if的多行字符串,位于较大的#if条件块内的新行中_C# - Fatal编程技术网

C# 包含#if的多行字符串,位于较大的#if条件块内的新行中

C# 包含#if的多行字符串,位于较大的#if条件块内的新行中,c#,C#,我有一些C#代码,其中包含一个多行字符串(这是一些代码模板),其中有些行以#if something开头。这一切都可以正常工作,除非我将整个C#类包装在实际条件#if#endif,在这种情况下编译器会说“无效的预处理器指令” 代码段: #if WIN32 class Something { string s = @" #if SOMETHING #endif"; } #endif 有没有办法让这一切顺利进行? 我曾考虑在代码模板中使用不同的字符,并使用替换来修复它,但这对我来说不是一个

我有一些C#代码,其中包含一个多行字符串(这是一些代码模板),其中有些行以
#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编译器。