我在C#8.0项目中启用了可空引用。我还将所有警告设置为错误,以迫使自己解决所有此类警告。但是其中之一使我感到困惑。它是一个依赖项属性,它返回一个接口指针,该指针可能有效地为null。这是属性(在名为“ 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);
}
启用了可为空的引用后,这可以理解地在吸气剂上引起警告。 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).
首先,他们在说什么“隐式”实施成员?这是explicitly >>实现的成员。我实际上就是在这里实现它。除此之外,我还尝试修复此问题,因为我修复了许多其他此类可以为空的属性:使该属性返回可为空的引用
public IShape? ShapeBeingDrawn // ONLY CHANGE IS HERE { get => GetValue(ShapeBeingDrawnProperty) as IShape; // NOW, JUST "get" IS UNDERLINED IN RED set => SetValue(ShapeBeingDrawnProperty, value); }
不幸的是,这没有帮助。我仍然遇到相同的错误,但是这次用红色下划线的唯一部分只是吸气剂的左侧(单词“ get”)。
最后,我能够通过将属性更改回普通引用并在吸气剂中使用硬强制转换来消除此错误
public IShape ShapeBeingDrawn { get => (IShape)GetValue(ShapeBeingDrawnProperty); set => SetValue(ShapeBeingDrawnProperty, value); }
但是现在,任何试图将此属性设置为null(有效)的代码都将收到编译器错误,我必须解决该错误。
private void LayerView_OnKeyDown(object sender, KeyEventArgs e) { // Don't do anything if we've disabled shape mouse/touch input. if (e.Key != Key.Escape) return; UnselectAll(); ShapeBeingDrawn = null; // COMPILER NO LIKEY }
那么集成可为空的引用和依赖属性的正确方法是什么?我是否应该只是#pragma警告禁用此类问题?如果可以的话,我想避免这种情况。
我在C#8.0项目中启用了可空引用。我还将所有警告设置为错误,以迫使自己解决所有此类警告。但是其中之一使我感到困惑。这是一个依赖项...
为什么会发生问题?