如何解决VB.Net为什么不是bug?
| 我遇到了我认为是错误的错误,而我只是想知道这是否已经成为一个问题,或者这不是问题,为什么。 在Visual Studio 2008中使用VB.Net编译器进行编译时,与类型上的只读属性有关的问题。 下面是类定义和一个不会编译的小型C#程序。 (并且在不编译恕我直言中是正确的,因为在委托中设置的属性是只读的)public interface ITest
{
bool PrivateBool { get; }
}
public class TestClass : ITest
{
bool privateBool = false;
public bool PrivateBool
{
get
{
return privateBool;
}
}
bool publicBool = false;
public bool PublicBool
{
get { return publicBool; }
set { publicBool = value; }
}
}
class Program
{
static void Main(string[] args)
{
TestClass tc = new TestClass();
//Compile Error
//tc.PrivateBool = false;
//Compile Error
//Action act = new Action(delegate()
//{
// tc.PrivateBool = false;
//});
//Action<TestClass> test = new Action<TestClass>(delegate(TestClass tcc)
//{
// tcc.PrivateBool = false;
//});
//Compile Time Error
//Action<TestClass> test = new Action<TestClass>( tz=> tz.PrivateBool = false);
//Compile Time Error
//Action test = new Action(tc.PrivateBool = false);
}
}
在VB.Net中但是,这是一个更大的问题……程序将毫无例外地编译和执行。但是该属性未设置。
这是在运行时陷入调试器的噩梦,我们认为编译器应该已经捕获到我们正在分配给仅准备就绪的属性,就像CSharp编译器在编译时提醒您一样。
Module Module1
Sub Main()
Dim tc As New TestClass()
Dim setP = New Action(Of TestClass)(Function(d As TestClass) _
d.PrivateBool = False _
)
setP.Invoke(tc)
End Sub
End Module
谁能解释这是否正确,为什么?
我假设有人会通过检查委托的参数类型来响应编译器的工作已完成,并且委托被键入以接受该参数,就像解析方法主体或函数主体时一样。
我对此的反驳是,当尝试从方法而不是委托中设置该属性时,编译器确实会引发错误。代表应与方法解析相同。
C#编译器是否在扩展自身?我觉得不是。我的经验是,这是vb.net编译器中的错误,应该通过IDE的补丁进行修复。
最后但同样重要的是,调用发生时会发生什么?
该委托肯定不会使用反射来自动设置属性,因此我假设CLR看到了只读限定符,并且执行了NOOP。那是实际发生的事情还是未定义的行为?
感谢您的时间!
解决方法
在VB.NET 2008中,没有语句lambda。所有lambda都是函数。它们返回一个值,而不执行操作。
您的VB lambda只需比较
d.PrivateBool
和False
并返回比较结果。
这不是错误,并且是设计使然。因此,建议避免将VB.NET 2008的lambda分配给“ 4”,这对于没有准备的人会造成极大的混淆。
声明lambdas出现在VB.NET 2010中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。