我知道C# 8 switch expression返回值或属性匹配的方法的语法。但是如果我们只需要打开一个字符串值并执行一个不返回任何内容(没有返回类型/void)的方法,那么我们该怎么做呢?我正在考虑某种形式的 Func 但不确定确切的语法。我知道我们可以用常规的 case 语句用旧的方式来做,但试图看看我们是否可以用新的语法实现同样的效果。
这是问题的例子
switch (stringvalue)
{
case "Add": Add(); break;
case "Subtract": Subtract(); break;
}
Run Code Online (Sandbox Code Playgroud)
可能是这样的:
stringvalue switch
{
"Add" => Add(),
"Subtract" => Subtract()
}
// but this complains that there needs to be assignment on left side for this
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我正在为项目服务编写一个函数,如果用户请求某个名称下的所有项目,它将全部返回。例如所有 iPhone X 等手机。
我得到了帮助,使其中一个功能正常工作,如果项目超过 1 个,它将全部返回(这是第三种情况):
var itemsList = items.ToList();
switch (itemsList.Count())
{
case 0:
throw new Exception("No items with that model");
case 1:
return itemsList;
case { } n when n > 1:
return itemsList;
}
return null;
Run Code Online (Sandbox Code Playgroud)
让我困惑的是什么是{ }为?有人告诉我这是“一个用于说明类型的地方”,我不确定他们的意思。
它也是如何运作的?我不确定n是为了什么。
任何帮助是极大的赞赏!
进度:在跟进帮助程序后,我现在知道这{ }类似于var. 但我仍然不确定为什么只在这里使用它。
我有一个HashSet<int>和一个List<int>(Hashset 大约有 300 万个项目,List 大约有 300k 个项目)。
我目前使用它们相交
var intersected = hashset.Intersect(list).ToArray();
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更快的方法来做到这一点。也许并行?
在这个人为的 C# 8 示例中:
#nullable enable
class Fred<T>
{
T Value; // If T is a nullable type, Value can be null.
public Fred() { }
public void SetValue(T value) { Value = value; }
public T GetValue() { return Value; }
public string Describe() { return Value.ToString() ?? "oops"; }
}
class George
{
George()
{
Fred<George> fredGeorge = new Fred<George>();
George g = fredGeorge.GetValue();
Fred<float> fredFloat = new Fred<float>();
float f = fredFloat.GetValue();
}
}
Run Code Online (Sandbox Code Playgroud)
我有三个设计目标:
我想在我的代码中使用新的开关,对于方法结果 make log 并 return IActionResult。
我尝试做这样的事情:
var response = (this._coreRepository.Write(value.Content, data.Id.ToString())); \\return bool
return response switch
{
true => () =>
{
this._log.LogInformation("Write is complited");
return Ok();
},
false => () =>
{
this._log.LogInformation("Error in writing");
return BadRequest();
},
_ => () =>
{
throw new Exception("Unexpected error");
}
};
Run Code Online (Sandbox Code Playgroud)
但编译器对我说cannot convert lambda expression to type 'IActionResult' because it is not a delegate type。
我该如何修复它?
我在 C# 8.0 项目中启用了可空引用。我还将所有警告设置为错误,以迫使自己解决所有此类警告。但其中之一让我感到困惑。它是一个依赖属性,它返回一个可能有效为空的接口指针。这是属性(在名为“LayerView”的控件内)
private static readonly DependencyProperty ShapeBeingDrawnProperty = DependencyProperty.Register(
nameof(ShapeBeingDrawn),
typeof(IShape),
typeof(LayerView),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
public IShape ShapeBeingDrawn
{
get => GetValue(ShapeBeingDrawnProperty) as IShape; // RIGHT SIDE OF "=>" UNDERLINED IN RED
set => SetValue(ShapeBeingDrawnProperty, value);
}
Run Code Online (Sandbox Code Playgroud)
启用可为空引用时,这会导致对 getter 的警告是可以理解的。get 的整个右侧用红色下划线标出,我收到此构建错误
1>C:\Users\jmole\Documents\Dev\Mobile\Core\Views\LayerView.xaml.cs(429,13,429,16): error CS8766:
Nullability of reference types in return type of 'IShape? LayerView.ShapeBeingDrawn.get' doesn't
match implicitly implemented member 'IShape ILayerView.ShapeBeingDrawn.get' (possibly because of
nullability attributes).
Run Code Online (Sandbox Code Playgroud)
首先,他们在谈论什么“隐式”实现的成员?这是一个显式实现的成员。我真的在这里实施它。但除此之外,我试图解决这个问题,因为我已经修复了许多其他此类有效可为空的属性:使属性返回一个可为空的引用
public IShape? ShapeBeingDrawn // ONLY CHANGE IS HERE
{ …Run Code Online (Sandbox Code Playgroud)