[英]Passing a struct via an Action in C# does not compile
我有一個可以正常工作和編譯的代碼,其中的Action定義為:
Action<double, double, double ....> OnBlah;
現在我有16個以上的參數,因此我想傳遞一個結構,因此將操作定義為:
Action<structName> OnBlah;
但是我在C#編譯器中收到一條錯誤消息,提示未初始化structName。 這很奇怪,因為:
答:以前在代碼中,我直接從結構傳遞了OnBlah的double參數。
B.結構通過定義初始化。
我正在使用VS 2010,我猜這是編譯器錯誤嗎?
為編譯器錯誤添加了復制代碼:
namespace CompilerBug
{
struct Test
{
public double a;
}
class Program
{
static Action<Test> OnBlah;
static void DoesCompileOk()
{
Test test;
test.a = 5;
OnBlah(test);
}
static void DoesNotCompileOk()
{
Test test;
int b = 0;
if (b == 4)
{
test.a = 5;
}
OnBlah(test);
}
static void Main(string[] args)
{
OnBlah = (t) => { };
}
}
}
這不是編譯器錯誤。 您需要先初始化結構,如編譯器所說。 大概您的錯誤實際上在調用委托的代碼中,因為沒有其他意義。
當您使用16參數double版本調用委托時,double參數已初始化。 如果尚未初始化它們,則編譯器將發出相同的錯誤。 例如:
private static void actDouble(double d)
{
}
static void Main(string[] args)
{
double d;
Action<double> act = actDouble;
act(d);//error on this line
}
無法編譯,並出現以下錯誤:
error CS0165: Use of unassigned local variable 'd'
在這方面,結構沒有什么特別的。
通常,遇到語法錯誤時,您的第一個猜測永遠不應是這是編譯器錯誤。 編譯器錯誤極為罕見,尤其是在像這樣廣泛使用的編譯器中。
在對添加了真實代碼的問題進行編輯之后進行更新
Test test;
int b = 0;
if (b == 4)
{
test.a = 5;
}
OnBlah(test);
編譯器不確定test
是否已完全初始化。 它不執行程序流分析。 您可以通過確保編譯器知道該結構已完全初始化來解決此問題。
Action<structName> OnBlah;
永遠不會提出您引用的錯誤; 如果無法解析Action
或structName
這兩種類型中的任何一種,則會抱怨-如果通用類型參數不合適,則會抱怨,但這是預期的。
如果OnBlah
是一個字段,它將自動初始化為null;否則,它將自動初始化為null。 如果是變量 ,則需要在使用前進行分配。 可以將其分配為null
,但是如果是這樣,則在嘗試調用它時會在運行時失敗(除非您執行null檢查)。 於是我們來調用; 如果我們假設非空,則需要提供一個參數,即
OnBlah(someValue); // or OnBlah.Invoke(someValue);
在這里,如果未定義 someValue
,則會出錯; 如果未明確分配 ,它將出錯。 對於確定的分配,將分配字段 。 除非初始化,否則不會變量。
在結構中的情況下,一個值是由使用構造(或返回值的另一種方法) 或者初始化, 或通過手動設置每場(這不應該是可能的,因為一個:結構應該是不可變的,和b:字段應為私有)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.