convincing C# compiler that execution will stop after a member returns
Posted
by Sarah Vessels
on Stack Overflow
See other posts from Stack Overflow
or by Sarah Vessels
Published on 2010-03-24T20:23:38Z
Indexed on
2010/03/24
20:33 UTC
Read the original article
Hit count: 335
I don't think this is currently possible or if it's even a good idea, but it's something I was thinking about just now. I use MSTest for unit testing my C# project. In one of my tests, I do the following:
MyClass instance;
try
{
instance = getValue();
}
catch (MyException ex)
{
Assert.Fail("Caught MyException");
}
instance.doStuff(); // Use of unassigned local variable 'instance'
To make this code compile, I have to assign a value to instance
either at its declaration or in the catch
block. However, Assert.Fail
will never, to the best of my knowledge, allow execution to proceed past it, hence instance
will never be used without a value. Why is it then that I must assign a value to it? If I change the Assert.Fail
to something like throw ex
, the code compiles fine, I assume because it knows that exception will disallow execution to proceed to a point where instance
would be used uninitialized.
So is it a case of runtime versus compile-time knowledge about where execution will be allowed to proceed? Would it ever be reasonable for C# to have some way of saying that a member, in this case Assert.Fail
, will never allow execution after it returns? Maybe that could be in the form of a method attribute. Would this be useful or an unnecessary complexity for the compiler?
© Stack Overflow or respective owner