TN.*_*TN. 5 c# compiler-construction compiler-warnings
我有以下信息:
警告:永远不会将字段分配给,并且始终将其默认值设置为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 // ...
};
}
Run Code Online (Sandbox Code Playgroud)
我认为这个消息不是真的.
它是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 // ...
};
}
}
Run Code Online (Sandbox Code Playgroud)
一个Expression 不是代码.这是意图 ; 所以在编译器级别,确实可以说没有代码实际上会分配该字段.有一个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
}
);
}
Run Code Online (Sandbox Code Playgroud)
注意什么不是对字段的任何分配; 只使用虚构的fieldof运算符(意思是:它直接嵌入字段句柄 - 它不使用string名称).
按照同样的逻辑,如果我们让它成为代表,警告就会消失:
public static readonly Func<MyEntity, MyClass> FromMyEntity = e => new MyClass
{
dbMyProp = e.MyProp // ...
};
Run Code Online (Sandbox Code Playgroud)
现在这是代码; 它不仅仅是一个对象模型,显示" 如果我被编译,我会做什么".
是的,这似乎是编译器的一个缺点。它显然无法看穿(不包括)表达式。
以下按预期打印“bbc”:
var exp = MyClass.FromMyEntity.Compile();
var mc = exp(new MyEntity { MyProp = "abc"});
Console.WriteLine(mc.MyProp);
Run Code Online (Sandbox Code Playgroud)
我尝试了一些技巧,例如 MyClass 上的私有构造函数,但警告仍然存在。
编译器似乎应用了更保守的算法,仅检查是否有任何(正常)成员分配给dbMyProp.
您会因为名称中包含两个不同的元素而感到困惑dbMyProp,但MyEntity.MyProp从未将其写到此处。
| 归档时间: |
|
| 查看次数: |
4433 次 |
| 最近记录: |