還沒有找到這個問題的答案(可能是因為我找錯了)。我只是想知道跟隨。為什么不可能有這個代碼:
if (obj is string str) {
// do stuff
}
if (obj is string str) {
// do stuff
}
這將引發以下錯誤:錯誤 CS0128 名為“str”的區域變數或函式已在此范圍內定義
我知道我可以改用這個:
{
if (obj is string str) {
// do stuff
}
}
{
if (obj is string str) {
// do stuff
}
}
但它還有其他缺點,對我來說最大的就是代碼行數更多。
我猜是因為編譯器實際上將代碼(兩者中的較高者)轉換為以下代碼:
string str = obj as string;
if (str != null) {
// do stuff
}
或者類似的東西。
如果是這種情況,我想知道為什么以及是否已經有比寫作更好的方法:
if (obj is string str1) {
// do stuff
}
if (obj is string str2) {
// do stuff
}
if (obj is string str3) {
// do stuff
}
希望有人能告訴我 C# Logic 中的問題是什么以及處理它的方法。如果這樣的問題已經存在,請鏈接它我真的找不到。
編輯:因為這個用例被問到了。首先,我想知道一般背后的邏輯,但其次,我現在有一個用例,由于某些原因,它無法以不同的方式處理。
在我有例如傳遞不同的資料并且我執行特定于型別的操作1 然后執行既需要的操作,然后執行另一個特定于型別的操作的情況下,這將很有用。
uj5u.com熱心網友回復:
問題是,為什么會出現錯誤:“Error CS0128 A local variable or function named 'str' is already defined in this scope”。
答案是,代碼if (obj is string str1)是宣告變數和賦值的語法糖。
我為此使用了sharplab.io:
public class C
{
public void M()
{
object obj = "Test string";
if (obj is string str1)
{
Console.WriteLine($"{obj} is a string");
}
}
}
編譯為:
public class C
{
public void M()
{
object obj = "Test string";
string text = obj as string;
if (text != null)
{
Console.WriteLine(string.Format("{0} is a string", obj));
}
}
}
所以 obj 變數不是在內部作用域中宣告的,而是在外部作用域中宣告的。
uj5u.com熱心網友回復:
只是為了建議一種替代方法來宣告事物以避免編譯錯誤:
您可以在條件之外宣告變數,然后像這樣使用它:
string? str;
if ((str = obj as string) != null)
{
// do stuff
}
if ((str = obj as string) != null)
{
// do stuff
}
它不是更好,但你可能更喜歡它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/475001.html
