Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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# 如何在switch语句中使用字符串资源_C#_Uwp_Windows 10_Switch Statement - Fatal编程技术网

C# 如何在switch语句中使用字符串资源

C# 如何在switch语句中使用字符串资源,c#,uwp,windows-10,switch-statement,C#,Uwp,Windows 10,Switch Statement,有没有办法将字符串资源与switch语句一起使用?尝试以编程方式获取字符串资源后,返回一个错误 错误 “resourceLoader”是变量,但与类型一样使用 C# 你在找什么?这只是我最近发现的东西(这是一个C#7特性),您所做的与我使用的用例略有不同,但我刚刚使用伪代码(调用另一个类的方法,该方法从switch语句中获取并返回字符串)运行了一个快速测试,该测试似乎有效。对于你所做的,我想你会有这样的东西: switch (value) { case string _ when (re

有没有办法将字符串资源与switch语句一起使用?尝试以编程方式获取字符串资源后,返回一个错误

错误

“resourceLoader”是变量,但与类型一样使用

C#

你在找什么?这只是我最近发现的东西(这是一个C#7特性),您所做的与我使用的用例略有不同,但我刚刚使用伪代码(调用另一个类的方法,该方法从
switch
语句中获取并返回字符串)运行了一个快速测试,该测试似乎有效。对于你所做的,我想你会有这样的东西:

switch (value)
{
    case string _ when (resourceLoader.GetString("SteveJohnson/Text") == value as string):
                    page = typeof(FistPage);
                    break;
    case string _ when (resourceLoader.GetString("PeteDavidson/Text") == value as string):
                    page = typeof(SecondPage);
                    break;

我认为您需要后退一步,看看为什么需要switch语句:可能需要一个可读的代码块。您可以轻松地使用两个
if()
s执行相同的操作:

现在你可以重写它,把它塞进一个开关,但我认为这不是合适的构造,因为它并没有增加可读性。您可以选择具有以下选项的词典:

var pageTypes = new Dictionary<string, Type>
{
    { resourceLoader.GetString("SteveJohnson/Text"), typeof(FirstPage) },
    { resourceLoader.GetString("PeteDavidson/Text"), typeof(SecondPage) },
    { resourceLoader.GetString("OneDrive/Text"), typeof(FirstPage) },
    { resourceLoader.GetString("Twitter/Text"), typeof(SecondPage) },
};

// Defaults to `null` when not mached
pageTypes.TryGetValue((string)value, out Type page);
return page;
var pageTypes=新字典
{
{resourceLoader.GetString(“SteveJohnson/Text”),typeof(FirstPage)},
{resourceLoader.GetString(“PeteDavidson/Text”),typeof(SecondPage)},
{resourceLoader.GetString(“OneDrive/Text”),typeof(FirstPage)},
{resourceLoader.GetString(“Twitter/Text”),typeof(SecondPage)},
};
//未加工时默认为'null'
pageTypes.TryGetValue((字符串)值,输出类型页);
返回页面;

您甚至可以通过初始化此字典一次来缓存资源查找,例如在包含类的构造函数中。

否,它们必须是编译时常量。看起来你可以用一本
字典来代替。我想你有打字错误
fistPage
firstPage
?@CodeCaster:“它们必须是编译时常量”——过去是这样,但现在不是了。不幸的是,这个问题的作者在发帖前没有花时间进行研究,但确实,关于
开关的限制的现有问答在很大程度上已经被最近添加到C#的特性所否定,即模式匹配,这就取消了对
case
语句的非常量表达式的全面禁止。@PeterDuniho我在问这个问题之前做了研究,但没有找到相关的来源。d219给出了一个答案,但代码返回了一个警告。@CodeCaster:是的,我不反对你对这个答案的抱怨。但它似乎确实完成了要求的任务。老实说,如果没有OP提供更多的上下文,那么基于词典的方法是否真的更具可读性还不清楚。也就是说,我唯一的观点是纠正这样一种观念,即在今天的C#中,
case
语句只需要使用常量表达式;要进行值比较,请将右侧类型强制转换为“string”
Hmm,您可能需要
ToString()
用于开关的值?(我写的测试代码在另一台笔记本电脑上,但已经在上面进行了编辑,看看是否有效,如果不行,我明天再看一看-它假设对象的
ToString
是您需要进行比较的对象)。尝试
ToString()后
警告仍然存在,OK启动了另一台笔记本电脑,因为我不明白为什么会出现问题-我浏览了上面的信息,认为这是一个错误,现在我意识到这是一个警告(正如您所说),已通过将原始的
作为字符串
移动到每个案例陈述中来更正;这就消除了警告:)还用discard
\uuu
替换了我之前的变量名,因为您不需要对该返回值做任何操作。
var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();

Type page = null;
if (value == resourceLoader.GetString("SteveJohnson/Text"))
    page = typeof(FirstPage);
else if (value == resourceLoader.GetString("PeteDavidson/Text"))
    page = typeof(SecondPage);
else if (value == resourceLoader.GetString("OneDrive/Text"))
    page = typeof(FistPage);
else if (value == resourceLoader.GetString("Twitter/Text"))
    page = typeof(SecondPage);      

return page;
var pageTypes = new Dictionary<string, Type>
{
    { resourceLoader.GetString("SteveJohnson/Text"), typeof(FirstPage) },
    { resourceLoader.GetString("PeteDavidson/Text"), typeof(SecondPage) },
    { resourceLoader.GetString("OneDrive/Text"), typeof(FirstPage) },
    { resourceLoader.GetString("Twitter/Text"), typeof(SecondPage) },
};

// Defaults to `null` when not mached
pageTypes.TryGetValue((string)value, out Type page);
return page;