2013-11-23 47 views
-2

我正在学习C和C#,并且此问题针对C#。我在msdn中查看指针,并且此代码未编译,它给出错误:错误1不能将类型int**隐式转换为int*。存在明确的转换(您是否缺少演员?)。我在这里错过了什么?错误不能将类型'int **'隐式转换为'int *'。存在明确的转换(您是否缺少演员?)

下面是代码:

int ix = 10; 
     unsafe 
     { 
      int* px1; 
      int* px2 = &ix; **The error is on this line** 
     } 

编辑: 这里是程序将其全部:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Management; 
using System.Diagnostics; 
using System.Windows.Forms; 
using practice; 

class Program 
{ 
    public delegate bool ThisIsTheDelegate(int number); 
    public delegate bool ThisIsAnotherDelegate(int number); 

    private static string address; 

    public static String Address 
    { 
     get 
     { 
      return address; 
     } 
     set 
     { 
      address = value; 
     } 
    } 

    static void Main() 
    { 
     int[] someArray = new int[] { 1, 2, 3, 5, 6, 7, 8, 9, 0 }; 
     foreach (int number in someArray) 
     { 
      Console.WriteLine(number); 
     } 

     int integer = 98; 
     string someString = "edited"; 
     string[] someStr = { "edited" }; 
     String[] anotherStringSomestr = new String[] { "edited" }; 

     var readWithLinq = from far in anotherStringSomestr 
          select far; 

     foreach (var some in readWithLinq) 
     { 
      Console.WriteLine(some); 
     } 

     Program newPro = new Program(); 
     bool isEven1 = newPro.isEven(99); 
     Console.WriteLine(isEven1); 
     ThisIsTheDelegate newDelegate = newPro.isEven; 
     Console.WriteLine(newDelegate(98)); 
     int[] numbers = { 1, 2, 3, 5, 6, 7, 8, 9 }; 
     List<int> evenNumbers = FilterArray(numbers, newDelegate); 
     foreach(int integer1 in evenNumbers) 
     { 
      Console.WriteLine(integer1); 
     } 
     List<int> oddNumbers = FilterArray(numbers, isOdd); 
     foreach (int integer1 in oddNumbers) 
     { 
      Console.WriteLine(integer1); 
     } 

     ThisIsAnotherDelegate anotherDelegate; 
     anotherDelegate = number => (number % 2 == 0); 
     Console.WriteLine("{0} is a even number", anotherDelegate(4)); 

     for (int i = 0; i < someString.Length; i++) 
     { 
      Console.WriteLine(someString); 
     } 

     for (int i = 0; i < someStr.Length; i++) 
     { 
      Console.WriteLine(someStr[i]); 
     } 

     Console.WriteLine(integer); 

     SimpleStruct structss = new SimpleStruct(); 
     structss.DisplayX(); 

     M.x = 1; 
     structss.x = 98; 

     Console.WriteLine(M.x); 
     Console.WriteLine(structss.x); 

     M.structtaker(ref structss); 
     M.classtaker(); 

     Console.WriteLine(structss.x); 
     Console.WriteLine(M.x); 

     M.x = 1; 
     structss.x = 98; 

     int ix = 10; 
     unsafe 
     { 
      int* px1; 
      int* px2 = &ix; 
     } 

     int selection = 98; 
     while (selection != 0) 
     { 
      mainMenu(); 
      Console.Write("Enter choice: "); 
      selection = Convert.ToInt32(Console.ReadLine()); 
      switch (selection) 
      { 
       case 0: 
        break; 
       case 1: 
        openSomething(); 
        break; 
       case 2: 
        calculator(); 
        break; 
       case 3: 
        coolestProgramEverALive(); 
        break; 
       case 4: 
        make_to_do_list(); 
        break; 
       case 5: 
        add_to_do_list(); 
        break; 
       case 6: 
        readToDoList(); 
        break; 
       case 7: 
        linq_and_arrays(); 
        break; 
       case 8: 
        calendar(); 
        break; 
       case 9: 
        linq_and_collections(); 
        break; 
       default: 
        Console.WriteLine("Unkown selection. Try again"); 
        break; 
      } 
     } 
    } 

    private static bool isOdd(int number) 
    { 
     return (number % 2 == 1); 
    } 

    private static List<int> FilterArray(int[] numbers, ThisIsTheDelegate newDelegate) 
    { 
     List<int> result = new List<int>(); 

     foreach (int item in numbers) 
     { 
      if (newDelegate(item)) 
       result.Add(item); 
     } 
     return result; 
    } 

    private static void linq_and_collections() 
    { 
     List<string> names = new List<string>(); 
     names.Add("Billy"); 
     names.Add("Steve"); 
     names.Add("Casandra"); 
     names.Insert(0, "Johanna"); 
     names.Add("Sonny"); 
     names.Add("Suzanne"); 
     names.Insert(2, "Sid"); 

     var queryLinqUpper = from name in names 
          where (name.StartsWith("S") || name.StartsWith("B") || name.StartsWith("J")) 
          let namesToUpper = name.ToUpper() 
          orderby namesToUpper 
          select namesToUpper; 
     foreach (var linqToUpper in queryLinqUpper) 
     { 
      Console.Write(linqToUpper + " "); 
     } 
     Console.WriteLine(); 
     M.WriteTextToConsole("Hello, world. Programming in C# is fun"); 
     char c = 'A'; 
     int count = 14; 
     String str = new String(c, count); 
     str.WriteTextToConsole(); 
     M.WriteTextToConsole(str); 

    } 

    private static void calendar() 
    { 
     Application.Run(new Form1()); 
    } 

    private static void readToDoList() 
    { 
     var files = from file in Directory.GetFiles(@"C:\data", "*.txt") 
        select file; 
     int number = 1; 
     foreach (var file in files) 
     { 
      Console.WriteLine(number + ". " + file); 
      number++; 
     } 
     Console.Write("What todolist do you want to read? Give me the name:"); 
     try 
     { 
      string name = Console.ReadLine(); 
      Address = Path.Combine(@"C:\data", name + ".txt"); 

      TextReader inFile = new StreamReader(Address); 
      while (inFile.Peek() != -1) 
      { 
       string line = inFile.ReadLine(); 
       Console.WriteLine(line); 
      } 
      inFile.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Exception thrown!", "Error"); 
      Console.WriteLine(ex.ToString()); 
     } 
    } 

    private static void linq_and_arrays() 
    { 
     int numberOfElements; 
     Console.WriteLine("Start by setting the int[] array."); 
     Console.Write("How many elements are there in your array?"); 
     numberOfElements = Convert.ToInt32(Console.ReadLine()); 
     int[] array = new int[numberOfElements]; 
     for (int i = 0, j = numberOfElements; i < numberOfElements; i++, j--) 
     { 
      Console.Write("Integers left to add {0}. Enter an integer:", j); 
      array[i] = Convert.ToInt32(Console.ReadLine()); 
     } 
     var arrayquery = from value in array 
         select value; 

     foreach (var val in arrayquery) 
     { 
      Console.WriteLine("Value from array:{0}", val); 
     } 

    } 

    private static void add_to_do_list() 
    { 
     Console.WriteLine("Which todolist do you want to modify?"); 
     listToDoLists(); 
     Console.Write("Enter name of todolist: "); 
     string name = Console.ReadLine(); 
     Address = Path.Combine(@"C:\data", name + ".txt"); 
     String tempString; 
     StreamWriter stream; 
     stream = File.AppendText(Address); 
     Console.Write("Enter your new ToDo: "); 
     tempString = Console.ReadLine(); 
     stream.WriteLine(tempString); 
     stream.Close(); 
     TextReader inFile; 
     inFile = new StreamReader(Address); 
     while (inFile.Peek() != -1) 
     { 
      string line = inFile.ReadLine(); 
      Console.WriteLine(line); 
     } 
     inFile.Close(); 
    } 

    private static void listToDoLists() 
    { 
     int filenumber = 1; 
     string[] filepaths = Directory.GetFiles("C:\\data\\", "*.txt"); 
     foreach (string file in filepaths) 
     { 
      Console.WriteLine(filenumber + ". " + file); 
      filenumber++; 
     } 
    } 

    private static void make_to_do_list() 
    { 
     string path, name; 
     string yesOrNo; 
     Console.Write("Enter name of todolist: "); 
     name = Console.ReadLine(); 
     path = Path.Combine(@"C:\data", name + ".txt"); 
     TextWriter outFile = new StreamWriter(path); 
     labelOne: // else clause : unknown answer 
     Console.WriteLine("Do you want to add something to todolist.Y/N?"); 
     yesOrNo = Console.ReadLine(); 
     if (yesOrNo.ToLower() == "y") 
     { 
      string line; 
      int lines; 
      Console.Write("How many lines?"); 
      lines = Convert.ToInt32(Console.ReadLine()); 
      for (int i = 0; i < lines; i++) 
      { 
       Console.Write("Enter a line of text: "); 
       line = Console.ReadLine(); 
       outFile.WriteLine(line); 
      } 
      outFile.Close(); 
     } 
     else if (yesOrNo.ToLower() == "n") 
     { 
      Console.WriteLine("You can close the application now."); 
     } 
     else 
     { 
      Console.WriteLine("Unknown answer. Try again"); 
      goto labelOne; 
     } 
    } 

    private static void coolestProgramEverALive() 
    { 
     System.Diagnostics.Process.Start(@"C:\Users\KristjanBEstur\Documents\Visual Studio 2012\Projects\The_coolest_program_ever_alive\The_coolest_program_ever_alive\obj\Debug\The_coolest_program_ever_alive.exe"); 
    } 

    private static void calculator() 
    { 
     System.Diagnostics.Process.Start("calc"); 
    } 

    private static void openSomething() 
    { 
     System.Diagnostics.Process.Start("notepad"); 
    } 

    private static void mainMenu() 
    { 
     Console.WriteLine("Main Menu"); 
     Console.WriteLine("0. Quit"); 
     Console.WriteLine("1. OpenSomething"); 
     Console.WriteLine("2. Calculator"); 
     Console.WriteLine("3. coolestProgramEverAlive"); 
     Console.WriteLine("4. Make todolist"); 
     Console.WriteLine("5. Add to todolist"); 
     Console.WriteLine("6. Read to do list"); 
     Console.WriteLine("7. Linq and arrays"); 
     Console.WriteLine("8. Calendar"); 
     Console.WriteLine("9. Linq and collections"); 
    } 


    public bool isEven(int number) 
    { 
     return (number % 2 == 0); 
    } 
} 

static class M 
{ 
    public static int x; 

    public static void WriteTextToConsole(this string text) 
    { 
     Console.WriteLine(text); 
    } 

    public static void structtaker(ref SimpleStruct s) 
    { 
     s.x = 5; 
    } 
    public static void classtaker() 
    { 
     M.x = 5; 
    } 
    } 

class Test 
{ 
    static int value = 20; 
    unsafe static void F(out int* pi1, ref int* pi2) { 
    int i = 10; 
    pi1 = &i; 
    fixed (int* pj = &value) { 
    // ... 
    pi2 = pj; 
    } 
    } 
} 

struct SimpleStruct 
{ 
public int x; 
private int xval; 
public int X 
{ 
    get 
    { 
     return xval; 
    } 
    set 
    { 
     if (value < 100) 
      xval = value; 
    } 
} 
public void DisplayX() 
{ 
    Console.WriteLine("The stored value is: {0}", X); 
} 

}

+4

该代码本身编译罚款。它必须是导致问题的一些周围的代码。你能扩展你的代码示例吗? – JaredPar

+1

你可能在'x'中使用'&x'这是一个指针。但是你的例子并没有表现出这个问题。 – CodesInChaos

+2

你发布的完整代码示例也编译得很好。 – JaredPar

回答

0

我移动我声明向下不安全块内并它修复了它,我不知道为什么?

下面是代码:

unsafe 
    { 
     int ix = 10; 
     int* px1; 
     int* px2 = &ix; 
    } 
+1

这很奇怪。我在VS2012和2013中试过这个,但是无法复制你的错误。想要使用C#(和工具)的版本? – Dweeberly

+0

@Dweeberly我正在使用Visual Studio 2012专业版 – somethingSomething

2

我希望我可以复制这一点,似乎是一个相当有趣的问题。下面是我相信适用于本(约格式化抱歉)标准的部分:

18.3 Fixed and moveable variables The address-of operator (§18.5.4) and the fixed statement (§18.6) divide variables into two categories: Fixed variables and moveable variables. Fixed variables reside in storage locations that are unaffected by operation of the garbage collector. (Examples of fixed variables include local variables, value parameters, and variables created by dereferencing pointers.) On the other hand, moveable variables reside in storage locations that are subject to relocation or disposal by the garbage collector. (Examples of moveable variables include fields in objects and elements of arrays.) The & operator (§18.5.4) permits the address of a fixed variable to be obtained without restrictions. However, because a moveable variable is subject to relocation or disposal by the garbage collector, the address of a moveable variable can only be obtained using a fixed statement (§18.6), and that address remains valid only for the duration of that fixed statement. In precise terms, a fixed variable is one of the following: • A variable resulting from a simple-name (§7.6.2) that refers to a local variable or a value parameter, unless the variable is captured by an anonymous function. • A variable resulting from a member-access (§7.6.4) of the form V.I, where V is a fixed variable of a struct-type. • A variable resulting from a pointer-indirection-expression (§18.5.1) of the form *P, a pointer-member-access (§18.5.2) of the form P->I, or a pointer-element-access (§18.5.3) of the form P[E]. All other variables are classified as moveable variables. Note that a static field is classified as a moveable variable. Also note that a ref or out parameter is classified as a moveable variable, even if the argument given for the parameter is a fixed variable. Finally, note that a variable produced by dereferencing a pointer is always classified as a fixed variable.

我花了一些时间,试图创建一个类似的错误,但并不打算。我能够重现该问题的唯一方法是使用下面的代码:

void test() { 
     int ix = 10; 
     unsafe { 
      int* px1 = &ix; 
      int* px2 = &px1; // **The error is on this line** 
      } 
     } 

当然这个代码不能被移动IX申报进入安全范围固定。也许你可以尝试在一小段代码中复制原始问题(如上所述),并验证问题和修复是否都复制。也许VS变得困惑。我遇到了一些毫无意义的问题,并通过退出VS并重新启动(不经常但是几次)而离开。

0

我移动了表达式“int i = 10;”脱离不安全块,现在编译。我还将代码置于另一个vs2012pro实例的新项目中。这也编译。所以现在我无法复制错误。

下面是代码:

 int ix = 10; 
     unsafe 
     {    
      int* px1; 
      int* px2 = &ix; 
      Test.F(out px1, ref px2); 
      Console.WriteLine("*px1 = {0}, *px2 = {1}", 
       *px1, *px2); // undefined behavior 
     } 

这是其他项目:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace saxerium 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     int ix = 10; 
     unsafe 
     { 
      int* px1; 
      int* px2 = &ix; 
      Test.F(out px1, ref px2); 
      Console.WriteLine("*px1 = {0}, *px2 = {1}", 
       *px1, *px2); // undefined behavior 
     } 
    } 
} 

class Test 
{ 
    static int value = 20; 
    public unsafe static void F(out int* pi1, ref int* pi2) 
    { 
     int i = 10; 
     pi1 = &i; 
     fixed (int* pj = &value) 
     { 
      // ... 
      pi2 = pj; 
     } 
    } 
} 

}

相关问题