C# 压制;从未将成员分配给;C语言警告#

C# 压制;从未将成员分配给;C语言警告#,c#,inotifypropertychanged,suppress-warnings,reactiveui,callermembername,C#,Inotifypropertychanged,Suppress Warnings,Reactiveui,Callermembername,我有以下代码: ViewPortViewModel _Trochoid; public ViewPortViewModel Trochoid { get { return _Trochoid; } set { this.RaiseAndSetIfChanged(value); } } 使用ReactiveUI INPC支持。编译器总是警告我,Trochoid从未分配给,并且始终为空。但是,由于RaiseAndSetIfChanged通过CallerMemberName支持执行的

我有以下代码:

ViewPortViewModel _Trochoid;
public ViewPortViewModel Trochoid
{
    get { return _Trochoid; }
    set { this.RaiseAndSetIfChanged(value); }
}
使用ReactiveUI INPC支持。编译器总是警告我,
Trochoid
从未分配给,并且始终为空。但是,由于
RaiseAndSetIfChanged
通过
CallerMemberName
支持执行的魔力,代码确实可以工作,编译器是错误的


如何在代码中完全禁止这些警告?

您可以为其指定一个引用类型的默认值:

ViewPortViewModel _Trochoid = null;
如何在我的代码中清除这些警告

除了不恰当的赋值,另一种选择是只使用
#pragma

#pragma warning disable 0649 // Assigned by reflection
ViewPortViewModel _Trochoid;
#pragma warning restore 0649
这应该是可行的,而且它将丑陋保持在记录它有意义的地方——在现场声明中

如果以相同的方式处理多个字段,则可以将它们全部放在禁用警告的同一“块”中,并对所有字段应用注释


当然,你是否认为这是一个“干净”的问题。我想我更喜欢它,而不是那些仅仅是为了消除警告的副作用而存在的任务。

既然每个平台在ReactiveUI中都有
CallerMemberNameAttribute
支持,那么就没有必要忍受你的强迫性编译器的压迫:

ViewPortViewModel _Trochoid;
public ViewPortViewModel Trochoid
{
    get { return _Trochoid; }
    set { this.RaiseAndSetIfChanged(ref _Trochoid, value); }
}

其他重载现在确实没有必要了,但我保留了它们,因为删除它们是一个突破性的更改,因此在ReactiveUI 5.0之前不会执行此操作,但在重写构造函数中的值时感觉不正确。如果您有像resharper这样的工具,这样做将导致它告诉您该字段可以设置为只读,尽管默认赋值是你无论如何都可以做的事情,但是你仍然需要给suppress添加一条注释。无论哪种方式,我们现在都在说“我们知道这没什么”。其中,我确实喜欢分组因素。但是,我是谁…我更喜欢这个,因为它也会阻止一个开发人员(可能是谁在使用resharper或类似工具)假设该字段可以设置为只读。我可以使用SuppressMessageAttribute,但我不知道如何从编译器警告中生成极其详细的attr吗?@bradgonesurfing:我不确定编译器是否使用了它-我希望FxCop等使用它。我可能是错的:)@BradGonessurfing操作已经在使用CallerMemberNameAttribute,并通过反射设置值:“但是由于RaiseAndSetIfChanged通过CallerMemberName执行的魔力”-我假设他们不想更改使用
RaiseAndSetIfChanged
的方式。如果使用Ref重载,它不会进行反射:)