![](/img/trans.png)
[英]Why does this LinqPad program produce different results on the second run?
[英]Why does this program only produce three warnings?
您看到的警告僅在編譯器可以證明用於初始化變量的表達式不可能導致任何副作用的情況下顯示。 當您只是為變量分配文字字符串,整數或null
值時,編譯器知道這些事情都不會導致副作用。 對於你的最后一個值,你不只是分配一個文字值; 你也在使用類型的顯式運算符,就編譯器而言,該運算符只是一些可以執行任何操作的代碼。 例如,它可能導致相關的副作用(它沒有,但編譯器不知道)會使該行不是多余的。
警告是最佳實踐建議,它們不是真正的錯誤。 Visual Studio非常聰明,可以看到你創建了變量,但從未使用過它們,因此它們毫無用處。 它建議你擺脫它們,因為你不使用它們。
如果你真的對它們做了些什么,那么錯誤就會消失。 例如,如果你說:
number += nullable;
將擺脫1個錯誤。 如果你做了類似的事情:
message = message + " and this is more message";
它會擺脫另一個錯誤。
我相信它看到了int? 作為一個對象,因為你將它轉換為可空變量,它無法弄清楚它是否已經被預先使用過。 我認為它與渲染有關的事情只是沒有被捕獲為錯誤,因為它無法判斷你是否在其他地方引用了該變量。
我認為這將是相當於這樣的事情:
var a = new SomeClass();
var b = a;
由於它無法判斷a是否真的被使用過,因此它不會顯示錯誤。 如果你把它放在真正的類中,它也不會顯示錯誤。
似乎警告沒有顯示,因為具有可空的行實際上在分配之前執行操作。 例如,以下代碼僅對名為number的變量生成警告。 這似乎是合乎邏輯的,因為帶有警告的行在當前代碼中實際上是無用的。 其他行可能在執行期間執行某些操作,並且不會“優化”。 要測試它在發布模式下使用調試器廣告運行代碼,您將看到所有帶有警告的行都被跳過(“優化”)
class Program
{
static void Main(string[] args)
{
string message = ';'.ToString();
int number = 6;
object obj = (object)(new t());
int? nullable = (int?)12;
}
class t
{ }
}
有了這個說。 可以為空的它沒有優化,因為從int'12'到int?的轉換。 由於它是真正的演員,而不是“無用的演員”,因此在運行期間需要進行操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.