gpt4 book ai didi

c# - 警告 : Field is never assigned to, 并将始终具有默认值 null

转载 作者:太空狗 更新时间:2023-10-29 23:09:18 24 4
gpt4 key购买 nike

我收到以下消息:

Warning: Field is never assigned to, and will always have its default value null.

我的代码看起来像(它被简化了,所以没用):

public class MyEntity
{
// ...
public string MyProp { get; set; }
}

public class MyClass
{
string dbMyProp;

public string MyProp { get { return dbMyProp.Replace("a", "b"); } }

public static readonly Expression<Func<MyEntity, MyClass>> FromMyEntity = e => new MyClass
{
dbMyProp = e.MyProp // ...
};
}

我认为消息不正确。

这是 C# 编译器中的错误还是我遗漏了什么?

更新 该字段是 dbMyProp。它已被简化,但仍会产生此警告。

UPDATE2 以下代码不会产生此类警告:

public class MyClass2
{
string dbMyProp;

public string MyProp { get { return dbMyProp.Replace("a", "b"); } }

public static MyClass2 FromMyEntity(MyEntity e)
{
return new MyClass2
{
dbMyProp = e.MyProp // ...
};
}
}

最佳答案

表达式 不是代码。这是意图;所以在编译器 级别,确实可以说没有代码实际分配过该字段。有一个 MemberAssignment(来自 Expression.Bind),但这是不相关的。

如果表达式被编译,那只能通过实际的字段赋值。这将是运行时的反射,编译器不会尝试检测。

编译时实际上是这样的:

static MyClass()
{
ParameterExpression CS$0$0000;
FromMyEntity = Expression.Lambda<Func<MyEntity, MyClass>>(
Expression.MemberInit(
Expression.New(
(ConstructorInfo)methodof(MyClass..ctor),
new Expression[0]
),
new MemberBinding[] {
Expression.Bind(
fieldof(MyClass.dbMyProp),
Expression.Property(
CS$0$0000 = Expression.Parameter(typeof(MyEntity), "e"),
(MethodInfo)methodof(MyEntity.get_MyProp)
)
)
}
),
new ParameterExpression[] {
CS$0$0000
}
);
}

请注意没有字段的任何分配;只需使用虚构的 fieldof 运算符(意​​思是:它直接嵌入字段句柄 - 它不使用名称的 string)。

按照同样的逻辑,如果我们将其设为委托(delegate),则警告消失:

public static readonly Func<MyEntity, MyClass> FromMyEntity = e => new MyClass
{
dbMyProp = e.MyProp // ...
};

现在这个代码;它不仅仅是一个对象模型,显示“这是我做的,如果我被编译了”。

关于c# - 警告 : Field is never assigned to, 并将始终具有默认值 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12527438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com